Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2009, 23:19   #1
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
Восклицание Запись данных из Listbox в файл

Здравствуйте. Очень нужна Ваша помощь. У меня есть программа:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Splitter1: TSplitter;
    ListBox2: TListBox;
    Panel1: TPanel;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Button3: TButton;
    SaveDialog1: TSaveDialog;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ViewClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TFileRecord = record
    namemetod: string [25];
    nameclass: string [25];
    curatr: string [25];
end;

  TRecFile = file of TFileRecord;

var

f:  TRecFile;
  r:  TFileRecord;
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
If OpenDialog1.Execute Then
Begin
ListBox1.Items.LoadFromFile(OpenDialog1.FileName);
End;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i,j: integer;
nameclass, namemetod, curatr, s: string;
begin
listbox2.clear;
curatr:=' ';
i:=0;
while trim(ListBox1.Items[i])<> 'implementation'do
begin
s:= trim(ListBox1.Items[i]);
        if (pos('= class', s)>0) and (pos(';', s)=0) then
        begin
        nameclass:= copy(s,1,pos(' ',s));
      inc(i);
   while trim(ListBox1.Items[i])<> 'end;'do
  begin
  s:= trim(ListBox1.Items[i]);
  if ((pos('procedure', s)>0) or (pos('function', s)>0)) and
   ((pos('virtual', s)=0)and (pos('dynamic', s)=0) and (pos('override', s)=0) and
    (pos('message', s)=0)) then
   begin  j:=pos(' ',s);  namemetod:='';
    while (s[j]<>'(') and (s[j]<>':') and (s[j]<>';') do
    begin namemetod:= namemetod+s[j]; inc(j); end;

    if curatr=' ' then curatr:= 'published';
    ListBox2.Items.add(namemetod + ' - ' + nameclass + ' - ' + curatr);
    end;
      if (pos('private',s)>0)  or
       (pos('protected',s)>0) or
       (pos('public',s)>0) or
       (pos('published',s)>0)
       then   curatr:=s;

   inc(i);
   end;
  end;
  inc(i);
 end;
end;

    procedure TForm1.Button3Click(Sender: TObject);
var
i: integer;
f: TRecFile;
r: TFIleRecord;
begin
if SaveDialog1.Execute then
  begin
  AssignFile(f, SaveDialog1.FileName);
  Rewrite(f);
  for i:=0 to ListBox2.Items.Count-1 do
    begin
    ///////////////////!!!!!!!!!!!!!!!!!!!
    r.namemetod:=Trim(ListBox2.Items.Names[i]);
 r.nameclass:=Trim(ListBox2.Items.Names[i]);
           r.curatr:=Trim(ListBox2.Items.Names[i]);
 /////////////////////!!!!!!!!!!!!!!!!!!!!!
    Write(f, r);
    end;
  CloseFile(f);
  end;  end;


procedure TForm1.ViewClick(Sender: TObject);
begin
with View do
begin
View:=TView.Create(Self);
if OpenDialog1.Execute then
  begin
  Caption:=ExtractFileName(OpenDialog1.FileName);
  Show;
  AssignFile(f, OpenDialog1.FileName);
  Reset(f);
    while not Eof(f) do
    begin
    Read(f, r);
    ListBox1.Items.Add(r.namemetod + ' - ' + r.nameclass + ' - ' + r.curatr);
    end;
  CloseFile(f);
  end
  else
  View.Free;
end;
end;

end.
Которая берет из pas-файла, который загружен в listbox1, имена всех статических методов; имена классов, к которым относятся методы; атрибуты доступа, в рамках которых находятся методы (privare, protected и т.д.) и заносит их в listbox2. Данные из listbox2 должны быть сохранены в структурированный файл, т.е. отдельно должны быть сохранены имя метода, имя класса и атрибут, а не одной записью, как хотелось бы. Для каждого имени атрибута запись должна быть следующей структуры: имя метода – класс - атрибут доступа.

Собственно в сохранении этих данных и загвоздка. Код, который в программе выводит пустоту...

Помогите, пожалуйста, разобраться...
lordsyrius вне форума Ответить с цитированием
Старый 06.05.2009, 10:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ListBox2.Items.Names[i])
Ты уверен что у тебя это возвращает то что нужно?
Может тебе нужно ListBox2.Items[i]...
Цитата:
имя метода, имя класса и атрибут
Поясни.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2009, 14:48   #3
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
По умолчанию

вот именно, чтоя не совсем уверен...если ставлю ListBox2.Items[i], то выводится вся запись три раза, т.е., например, так: Button1Click - TForm1 - published - Button1Click - TForm1 - published - Button1Click - TForm1 - published, а должно быть так: Button1Click - TForm1 - published и всё.
lordsyrius вне форума Ответить с цитированием
Старый 07.05.2009, 17:52   #4
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
По умолчанию

вопрос остается открытым...
lordsyrius вне форума Ответить с цитированием
Старый 08.05.2009, 18:38   #5
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
По умолчанию

Люди, мне написали код:

Добавление метода:
Код:
  ...
  SetLength(KnownMethods, Length(KnownMethods) + 1);
  KnownMethods[High(KnownMethods)].namemetod := namemetod;
  KnownMethods[High(KnownMethods)].nameclass := nameclass; 
  KnownMethods[High(KnownMethods)].curatr := curatr;
  ListBox2.Items.add(namemetod + ' - ' + nameclass + ' - ' + curatr);
  ...

Сохранение в файл:

Код:
  ...
  FS := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareExclusive);
  try
    FS.WriteBuffer(KnownMethods[0], Length(KnownMethods) * SizeOf(TFileRecord));
  finally
    FreeAndNil(FS);
  end;
  ...

Загрузка из файла:

Код:
  ...
  FS := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
  try
    SetLength(KnownMethods, FS.Size div SizeOf(TFileRecord));
    FS.ReadBuffer(KnownMethods[0], Length(KnownMethods) * SizeOf(TFileRecord));
  finally
    FreeAndNil(FS);
  end;
  ...
Помогите, пожалуйста правильно его вставить в мою программу.

P.S. Там создается массив из записей
lordsyrius вне форума Ответить с цитированием
Старый 10.05.2009, 18:03   #6
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
По умолчанию

Неужели никто не знает, как решить мою проблему!?
lordsyrius вне форума Ответить с цитированием
Старый 10.05.2009, 20:13   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

procedure TForm1.Button2Click(Sender: TObject);
var
mrec: array of Tfilerecord;
len: integer;
.....
begin
len:=0;
.......
после строки (можно даже вместо нее)
ListBox2.Items.add(namemetod + ' - ' + nameclass + ' - ' + curatr);
добавляем следующие строки

Код:
begin
len:=len+1;
setlength(mrec,len);
mrec[len-1].namemethod:=namemetod;
mrec[len-1].nameclass:=nameclass;
mrec[len-1].curatr:=curatr;
end;
// запись в файл
for j:=0 to len-1 do
write(f,mrec[j]);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.05.2009, 20:16   #8
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
По умолчанию

Спасибо! Сейчас буду пробовать...
lordsyrius вне форума Ответить с цитированием
Старый 10.05.2009, 20:31   #9
lordsyrius
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 24
По умолчанию

А как связать переменные из Button2Click с переменными в Button3Click? А то сохраняется пустой файл.
lordsyrius вне форума Ответить с цитированием
Старый 10.05.2009, 20:34   #10
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

А вы засуньте эти переменные не в события, а в секцию private:
Код:
...
private
  {private declarations}
  perem1, perem2: integer;
  perem3: string;
...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как копировать файл в String из ListBox? dolphin705 Общие вопросы Delphi 10 04.05.2009 16:53
Запись данных в файл на С# fractal Помощь студентам 15 17.02.2009 22:14
Запись в файл |{ot Общие вопросы Delphi 6 05.07.2008 02:24
как из ListBox`a дописать текст в файл? One.Love Общие вопросы Delphi 1 14.01.2008 07:20
запись данных в файл Артэс Общие вопросы C/C++ 13 09.06.2007 22:01