Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

Есть кусок кода, как оптимизировать, что не так, где дурной тон?   Найти похожие ветки 

 
Starcom   (2005-08-04 12:36) [0]

Привет Мастера!

Есть кусок кода, как оптимизировать, что не так, где дурной тон?

>>>
procedure TForm1.Button1Click(Sender: TObject);
const
 Imp = ".\Doc\import.rtf";
 Otech = ".\Doc\otech.rtf";
 TelRtel = ".\Doc\telrtel.rtf";
 VidMagCam = ".\Doc\vidmagcam.rtf";
 AutoMagCd = ".\Doc\automagcd.rtf";
begin
 if RadioButton1.Checked = True then Form2.Show;
 Form2.RxRichEdit1.PlainText := False;
 Form2.RxRichEdit1.Lines.LoadFromFile(Imp);

 if RadioButton2.Checked = True then Form3.Show;
 Form3.RxRichEdit1.PlainText := False;
 Form3.RxRichEdit1.Lines.LoadFromFile(Otech);

 if RadioButton3.Checked = True then Form4.Show;
 Form4.RxRichEdit1.PlainText := False;
 Form4.RxRichEdit1.Lines.LoadFromFile(TelRtel);

 if RadioButton4.Checked = True then Form5.Show;
 Form5.RxRichEdit1.PlainText := False;
 Form5.RxRichEdit1.Lines.LoadFromFile(VidMagCam);

 if RadioButton5.Checked = True then Form6.Show;
 Form6.RxRichEdit1.PlainText := False;
 Form6.RxRichEdit1.Lines.LoadFromFile(AutoMagCd);

 Form1.Hide;
end;
<<<

С Уважением Starcom! ;-()


 
ЮЮ ©   (2005-08-04 12:41) [1]

Пять форм вместо одной?
И на тех формах такте же Magic Buttons? Круто!


 
ЮЮ ©   (2005-08-04 12:44) [2]

Пять форм вместо одной?
И на тех формах такие же Magic Buttons? Круто!

Imp, Otech и т.д. замени на FileName2, FileName3 - тогда всё будет выдержанно в одном стиле, да и "расширяться" проще будет :)

А оптимизировать тут нечего, если медленно пашет - здесь не убыстрить :(


 
Fay ©   (2005-08-04 12:45) [3]

2 Starcom   (04.08.05 12:36)
1) Первое впечатление - "бредятина".
2) Вместо LoadFromFile(".\Doc\automagcd.rtf"); пиши полный путь.


 
Digitman ©   (2005-08-04 12:48) [4]


> где дурной тон?


везде.

однотипные операции прямо таки напрашиваются на то чтобы их поместили в цикл ... отсюда напрашивается и массив имен файлов вместо индивидуальных деклараций стр.значений


 
Fynjy1984 ©   (2005-08-04 12:53) [5]

2 Starcom   (04.08.05 12:36)  

1)Поясните, что должна делать процедура?

2)

>  Form2.RxRichEdit1.PlainText := False;
>  Form2.RxRichEdit1.Lines.LoadFromFile(Imp);

Эти строки должны выполнятся вне зависимости от выполнения условия?


 
Zeqfreed ©   (2005-08-04 13:13) [6]

Starcom   (04.08.05 12:36)
Стандартные имя процедуры и имена компонентов тоже дурной тон.

Уславия if BooleanFlag = True then заменяются на if BooleanFlag then


 
pasha_golub ©   (2005-08-04 13:29) [7]

Однако можно создать один класс формы, в конструкторе коей передавать имя файла для загрузки.

А, вообще, надо бы очерить предметную область. Чего хочет сделать программа, может быть вообще нафиг не надо куча экземпляров форм, может быть  достаточно одной. Только с закладками, а может и вообще закладок нафиг не надо.


 
Starcom   (2005-08-04 13:36) [8]

1) Без проблем, можно и на одной форме.
2) Имена файлов О"кей.
3) Form2.RxRichEdit1.PlainText := False; енто нафиг,организовать
в свойствах компонента.
4) Просто если файлы большие, и в OnCreate каждой из
форм выполняю LoadFromFile(...), то приложение тупит вначале,
т.е Форма выбора раздела отображается не полностью, вот почему
процедура выполнена в ней (Быстрая загрузка Основной формы, но
медленная в остальных) Я не силён в терминологии!

С Уважением Starcom! 8)


 
Alex Konshin ©   (2005-08-04 14:00) [9]

А зачем при загрузке приложения создавать все формы?


 
Digitman ©   (2005-08-04 14:01) [10]


>  если файлы большие.. то приложение тупит вначале


вынеси загрузку в доп.трэд

при загрузке делай свой RichEdit (или форму, которой он принадлежит) невидимым.

по окончанию загрузки пусть доп.тред известит осн.тред об этом факте, с тем чтобы осн.тред знал когда можно сделать беспроблемное Visible = True


 
Fay ©   (2005-08-04 14:13) [11]

2 Digitman ©   (04.08.05 14:01) [10]
Странный способ...
[9] понятнее...


 
Digitman ©   (2005-08-04 14:19) [12]


> Fay ©   (04.08.05 14:13) [11]


> Странный способ...


но вполне имеющий право на жизнь в ряде случаев ...


 
Starcom   (2005-08-04 14:28) [13]

Digitman ©   (04.08.05 14:01) [10]
(или форму, которой он принадлежит) невидимым.

Так и делаю: Просто при загрузке в RichEdit, rtf файла
идёт подвисание на 2-3 сек!


 
Digitman ©   (2005-08-04 14:44) [14]


> Так и делаю


ЧТО делаешь ?!

я тебе - о доп.трэдах, понимаешь ли, долдоню тут) ... коих в твоем алгоритме, судя по приведенному коду, и в помине нет ...


 
REA   (2005-08-04 15:36) [15]

>TForm1.Button1Click

дурной тон


 
Джо ©   (2005-08-04 16:01) [16]

Вот такой образец уже смотрится более прилично.
Создай пустой проект с двумя формами. С Auto-create оставь только Form1!!
На первой форме: TRadioGroup с 5 строками . И кнопка, с обработчиком. И обработчик формы OnCreate.
На второй: TRichEdit и все остальное, что нужно.


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   RadioGroup1: TRadioGroup;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   FInfoPath: string;
   procedure ShowInfoFrm (AIndex: Integer);
   function GetInfoFileName (AIndex: Integer): string;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if RadioGroup1.ItemIndex <> -1 then
   ShowInfoFrm(RadioGroup1.ItemIndex)
 else
   MessageDlg ("Выберите пункт",mtWarning,[MBOK],-1)
end;

function TForm1.GetInfoFileName(AIndex: Integer): string;
const
 InfoFiles: array [0..4] of string =
 (
   "import.rtf",
   "otech.rtf",
   "telrtel.rtf",
   "vidmagcam.rtf",
   "automagcd.rtf"
 );
begin
 if AIndex in [Low(InfoFiles)..High(InfoFiles)] then
   Result := FInfoPath + InfoFiles[AIndex]
 else
   raise Exception.Create("Неверный номер документа");
end;

procedure TForm1.ShowInfoFrm(AIndex: Integer);
var
 Frm: TForm2;
begin
 Frm := TForm2.Create(nil);
 try
   Screen.Cursor := crHourGlass;
   try
     Frm.RichEdit1.Lines.LoadFromFile(
       GetInfoFileName(AIndex)
     );
   finally
     Screen.Cursor := crDefault;
   end;
   Frm.ShowModal;
 finally
   Frm.Free;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FInfoPath := ExtractFilePath(ParamStr(0)) + "Doc\"
end;

end.

Все, что нужно будет править впоследствии, это массив-константа строк, указывающих на имена документов InfoFiles и добавить строк в TRadioGroup.
Пока документ не загрузится в TRichEdit, форма не покажется, просто будут висеть часики. Выглядит получше.


 
Джо ©   (2005-08-04 16:31) [17]

Можно сделать еще универсальней.

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   RadioGroup1: TRadioGroup;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure ReadDatabase (const AFileName: string;
     ACaptions,AInfoFiles: TStrings);
   procedure FormDestroy(Sender: TObject);
 private
   FInfoPath: string;
   FInfoFiles: TStrings;
   procedure ShowInfoFrm (AIndex: Integer);
   function GetInfoFileName (AIndex: Integer): string;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if RadioGroup1.ItemIndex <> -1 then
   ShowInfoFrm(RadioGroup1.ItemIndex)
 else
   MessageDlg ("Выберите пункт",mtWarning,[MBOK],-1)
end;

function TForm1.GetInfoFileName(AIndex: Integer): string;
begin
 if AIndex <= FInfoFiles.Count then
   Result := FInfoPath + FInfoFiles[AIndex]
 else
   raise Exception.Create("Неверный номер документа");
end;

procedure TForm1.ShowInfoFrm(AIndex: Integer);
var
 Frm: TForm2;
begin
 Frm := TForm2.Create(nil);
 try
   Screen.Cursor := crHourGlass;
   try
     Frm.RichEdit1.Lines.LoadFromFile(
       GetInfoFileName(AIndex)
     );
   finally
     Screen.Cursor := crDefault;
   end;
   Frm.ShowModal;
 finally
   Frm.Free;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FInfoFiles := TStringList.Create;
 FInfoPath := ExtractFilePath(ParamStr(0)) + "Doc\";
 ReadDatabase (ExtractFilePath(ParamStr(0))+"data.csv",
   RadioGroup1.Items,
   FInfoFiles);
end;

procedure TForm1.ReadDatabase(const AFileName: string;
 ACaptions,AInfoFiles: TStrings);

 procedure SplitString (const ASource: string; var ACaption,AInfoFile: string);
 const
   Delimiter: Char = ";";
 var
   N: Integer;
 begin
   ACaption := "";
   AInfoFile := "";
   N := Pos (Delimiter,ASource);
   ACaption := Copy (ASource,1,N-1);
   AInfoFile := Copy (ASource,N+1,Length(ASource));
 end;
var
 Lst: TStrings;
 I: Integer;
 ACaption,
 AInfoFile: string;
begin
 ACaptions.Clear;
 AInfoFiles.Clear;

 Lst := TStringList.Create;
 try
   Lst.LoadFromFile(AFileName);
   for I := 0 to Lst.Count-1 do
   begin
     SplitString(Lst[I],ACaption,AInfoFile);
     ACaptions.Add(ACaption);
     AInfoFiles.Add(AInfoFile);
   end;
 finally
   Lst.Free;
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FInfoFiles.Free;
end;

end.

В папке с программой должен находиться файл data.csv образца:

Импорт;import.rtf
Отех;otech.rtf
Телртел;telrtel.rtf
Видмагкам;vidmagcam.rtf
АвтомагКД;automagcd.rtf

Этот файл читается при старте программы, в зависимости от его содержимого настраивается TRadioGrouop с пунктами выбора.
В данном случае, для того, чтобы добавить новые пункты в программу, вообще ничего в ней править не придется. Достаточно внести изменения в файл данных. Который, кстати говоря, очень удобно обрабатывать в Excel.


 
Starcom   (2005-08-04 21:10) [18]

Привет Мастера!

Всем Огромное спасибо! Особенно Джо ©   (04.08.05 16:31) [17]
Мне очень понравилось. Правда!!!

Вразумили чут-чуть!
Как говорится, далеко мне ещё до Вас... парни!
Но я надеюсь, может что нибудь с меня получится.

Но простите за нескромность, мне на Form2 нужна
ещё одна Button2, для возврата в Form1, для нового
выбора, пишу так ... но при OnClick ничего не происходит!

...
procedure TForm2.Button2Click(Sender: TObject);
begin
Form1.Visible :=True;
Form2.Visible :=False;
end;
...

Есть соображения!

С Уважением Starcom! ;-()


 
Джо ©   (2005-08-04 21:17) [19]

Если тебе нужно просто закрыть вторую форму, то в TForm2.Button2Click напиши Close;


 
Starcom   (2005-08-04 21:32) [20]

Джо ©   (04.08.05 21:17) [19]

Я с вами совсем обленился! типо сам бы не допёр!
К хорошему быстро привыкаеш!!! :)


 
Defunct ©   (2005-08-05 08:05) [21]

Джо ©   (04.08.05 21:17) [19]

Поставить кнопке свойство ModalResult := mrOk
и модальная форма будет сама закрываться.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.042 c
14-1122964964
kull
2005-08-02 10:42
2005.08.28
В спорах рождается истина?


14-1123133742
Ega23
2005-08-04 09:35
2005.08.28
С днем рождения! 4 августа


1-1123288790
DFR
2005-08-06 04:39
2005.08.28
Как отловить момент, когда Screen Saver закончил работу


14-1123247971
Empleado
2005-08-05 17:19
2005.08.28
как иностранцу сойти за русского в Москве


1-1123251915
Андрей Молчанов
2005-08-05 18:25
2005.08.28
Node.CustomSort





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский