IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Множественный Edit в Delphi 6 (https://www.imho.ws/showthread.php?t=81572)

KsarDoS 13.03.2005 02:49

Множественный Edit в Delphi 6
 
Задачка, собственно проста. (И от этого стыдно, блин:(). Мне надо создать массив Edit'ов и у всех их поменять событие OnKeyDown...

Думаю, что надо это провернуть при помощи создания класса-потомка TEdit,но не знаю, как мне это замутить.Помогите, плиз!!! :confused:

IGaDI 13.03.2005 14:06

Попробуй так

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FCheckboxes: TList;
function GetCheckbox(Index: integer): TCheckbox;
public
property Checkboxes[Index: integer]: TCheckbox read GetCheckbox;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
AComponent: TComponent;
begin
FCheckboxes := TList.Create;

{ ТАКЖЕ: это собирает все CheckBox в порядке очередности }
for i := 0 to ComponentCount - 1 do
if Components[i] is TCheckbox then
FCheckboxes.Add(Components[i]);

{ ИЛИ: если они имеют имя CheckboxNN и вы хотите
разместить их в массиве в том же порядке... }
{for i := 1 to MaxInt do begin
AComponent := FindComponent( 'Checkbox' + IntToStr( i ) ) ;
if AComponent = NIL then break ;
FCheckboxes.Add( AComponent ) ;
end ;}
end;

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

function TForm1.GetCheckbox(Index: integer): TCheckbox;
begin
Result := TCheckbox(FCheckboxes[Index]);
end;

KsarDoS 13.03.2005 19:42

Как я понял из текста проги, она собирает в массив все чек_боксы на форме.. Но мне надо создать массив Едитов, которых еще нет на форме и разместить их в произвольном порядке, одновременно сделав так, чтобы у всех их срабатывало событие ОнКейДаун. Конкретно - мне надо чтобы юзер проги мог их по форме двигать при помощи Ctrl+arrows.Вот :idontnow: Уже все мозги себе прокипятил...

Можно было бы конечно кажому Едиту отдельно процедуру прописать.. Но если их будет под 100? :( Тем более, что в последствие собираюсь сделать из этого компонент.Там вобще универсальность нужна...

KsarDoS 14.03.2005 23:07

Небольшой примерчик
 
Вложений: 1
Вот. Должно получиться что-то вроде этого, только Сколько будет Edit'ов зарание не известно.Но у всех должны быть определены зарание события ОнЕнтер,ОнESC,ОнКейДаун. Я не знаю, как тут лучше поступить.. Может ктонить все-таки шарит?Хелп, плиззз!! :help:

dyr_farot 15.03.2005 00:01

все довольно просто:
где-нить ( например в privat' е формы ) объявляеш массив TEdit* edits[100] и переменную на количество этих Edit' ов: int editsCount;
потом где-нить ( например в OnCreate' e формы ) пишеш
for ( int i = 0; i < ...; i++ )
{
TEdit *edit = new TEdit(NULL);//т.к. нам его удалять
edit->OnKeyDown = Edit_OnKeyDown;// ее предварительно нужно описать (в том же привате ) как void __fastcall Edit_OnKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
edit->Tag = editsCount;//что б его потом найти
editsCount++;
//тут еще парента присобачить и парент-виндов и расположение
}

+ не забываем про удаление

если что-то еще не понятно -- пиши

KsarDoS 15.03.2005 02:02

Ты не мог бы растолковать, как это проделать в Дельфе.Я В Синтаксисе Сихи не силен... Plz...

dyr_farot 15.03.2005 16:40

попробую ( я с делфями давно не работал )
значит так...
массив тогда нужно объявлять как edits[100] TEdit ( если не ошибся )
цикл он и в африке цикл...
TEdit *edit = new TEdit(NULL); превращается в edit = TEdit.Create(NIL); ( нужно будет где-нить объявить edit :TEdit ( так кажись )
обработчик присваивается так же, а объявляется как procedure Edit_OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

кажись все

bloodman 16.03.2005 01:13

Создание Tedit'a делается так

unit ..
.....
var
Edits : array[0..100] of TEdit;
count : integer;

...

procedure lala ();
begin

Edits[count]:=TEdit.Create(Form1);
Edits[count].parent:= имя панели или где их тебе надо разместить
Edits[count].OnEnter:=OnEnterEdits - это твоя процедура, должна быть определена в классе формы. (procedure TForm1.OnEnterEdits....)
и так далее.
Для более конкретного ответа нужно больше данных. Хотя, в принципе, я тебе все, чтобы ты смог сделать сказал.Тебе только нужно оформить как тебе нужно.

Al-x 16.03.2005 08:19

Лучше не создавать статический массив Edito'ов, а создавать их динамически и пихать ссылки на них в TList (как предложил IGaDI, только с Edit'ами вместо checkbox'ов - принципиальной разницы в этом смысле нет :)). А события OnEnter (да и любые другие) привязываются как у bloodman.
ЗЫ: Если не разберёшься - вечерком покажу как :)

Al-x 16.03.2005 19:30

Вложений: 1
Переделал твой проект - добавил кнопку и динамический список :) Смотри вложение.

KsarDoS 16.03.2005 22:37

Все Ок. Я еще все таки написал компонент. Так препод попросил. И теперь, благодаря Al-x у меня генереться мои личные Едиты... :)Щаз еще напишу Сохранение координат в .ини и можно сказать - полноценный квик-репорт :biggrin: Кстати, если вызвать метод form1.print, с какими настройками форма будет печататься? И можно как нибудь эти параметры изменить..?

З.ы. :beer:


Часовой пояс GMT +4, время: 16:36.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.