Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как сделать подобную PHP конструкцию в Delphi?


Автор: skeef 6.3.2010, 10:43
Пришел в Delphi из PHP и сейчас активно осваиваю его (Delphi). Столкнулся с такой проблемой: на форме расположено 20 ComboBox`ов и столько же полей Edit. Все это соответствует столбцам некоего Excel файла. Имена cbA, cbB ... cbT и edA ... edT соответсвенно.

В PHP код был бы прост до безобразия:

Код

$arLet = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', ); 
$arlen = count($arLet);
for $i = 0 to $arlen {
 $cb = 'cb'.$arLet[$i];
 $ed = 'ed'.$arLet[$i];
 $$cb.ItemIndex = ...
 $$ed.Text = ...
}


Не совсем верно с точки зрения синтаксиса, но идея, думаю, понятна. 
Здесь я использую возможность языка PHP работать с переменными переменными, т.е. (для тех кто не знает) динамически в цикле создаю имя переменной.

В Делфи такой возможности, как я понял перерыв инет, просто нет, поэтому код из 10 строк на PHP превращается в сотню строк на Delphi. 
Скорее всего я иду не в ту сторону. Подскажите, подтолкните, дайте ссылку. 
Заранее благодарен за дельные советы

Автор: Regulum 6.3.2010, 11:00
А что если заранее закинуть ссылки на компоненты в массив (например в обработчике OnShow Вашей формы)
Код

var //объявляем глобально массивы
     Combos: array [1..20] of TComboBox;
     Edits: array [1..20] of TEdit;

........
procedure TForm1.FormShow(Sender: TObject);
begin
    Combos[1]:= ComboBox1;
    Combos[2]:= ComboBox2;
     ......
    Combos[20]:= ComboBox20;
    Edits[1]:= Edit1;
    ........
    Edits[20]:= Edit1;
end;


а потом можно также в цикле использовать, только не с буквенными индексами, а с числовыми

Код

for i=1 to 20
begin
     Combos[i].ItemIndex:=....;
     Edits[i].Text:= ...;
end

Автор: Matematik 6.3.2010, 11:09
Грубо, без проверок правильности заполнения
Код

unit Unit1;

interface

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

const
  CbCount = 3;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    FEditList: array[1..CbCount] of TEdit;
    FCBoxList: array[1..CbCount] of TComboBox;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var j: Integer;
begin
  for j:=1 to CbCount do
  begin
    FCBoxList[j].ItemIndex := FCBoxList[j].Items.Add(FEditList[j].Text);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var j: Integer;
begin
  for j:=1 to CbCount do
  begin
    FEditList[j] := FindComponent('Edit'+IntToStr(j)) as TEdit;
    FCBoxList[j] := FindComponent('ComboBox'+IntToStr(j)) as TComboBox;
  end;
end;

end.


Автор: samsamich 6.3.2010, 11:10
Цитата(Regulum @  6.3.2010,  11:00 Найти цитируемый пост)
объявляем глобально массивы
глобально не есть хорошо. лучше эти массивы сделать членами класса формы.

Автор: Regulum 6.3.2010, 11:16
Именно это и имел ввиду, просто не так выразился. Хотел сказать, что объявлять не внутри процедуры, откуда будет вызов

Автор: skeef 6.3.2010, 11:17
Благодарю за оперативность! Обязательно возьму на вооружение

Цитата(samsamich @ 6.3.2010,  11:10)
Цитата(Regulum @  6.3.2010,  11:00 Найти цитируемый пост)
объявляем глобально массивы
глобально не есть хорошо. лучше эти массивы сделать членами класса формы.

Ну этому меня еще РНР научил smile

Всем огромное спасибо

Автор: k0rvin 9.3.2010, 21:01
Цитата(skeef @ 6.3.2010,  10:43)
Не совсем верно с точки зрения синтаксиса, но идея, думаю, понятна. 
Здесь я использую возможность языка PHP работать с переменными переменными, т.е. (для тех кто не знает) динамически в цикле создаю имя переменной.

В Делфи такой возможности, как я понял перерыв инет, просто нет, поэтому код из 10 строк на PHP превращается в сотню строк на Delphi. 
Скорее всего я иду не в ту сторону.

не в ту, генерация имен переменных/функций -- плохая практика. храни данные в массиве/списке/хеш-таблице

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)