Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Xupyp1 НУ тогда нормально. Просто тут как бы многие или еще и Си пользуются, или пользуются динамическими массивами. И из-за этого счетчики начинаются с нуля.
Кстати писать вот так тоже не есть хороший тон.
Код:
Const MaxCount = 20; Var QArray:array of TPanel; LabelArray:array of TLabel; EditArray:array of TEdit; I: Integer; my_obj: PObject; Begin SetLength(QArray, MaxCount); SetLength(LabelArray, MaxCount); SetLength(EditArray, MaxCount);
//тут твоя работа такая же как и в том массиве, просто можешь смотреть на MaxCount или на Length(QArray) например .... //а потом можешь сделать так For I := Low(QArray) To High(QArray) Do Begin If Assigned(QArray[I]) Then Begin my_obj := (QArray[i] as TPanel).ClassInfo; FreeAndNil(my_obj); End; End; //подчистим сам массив SetLength(QArray, 0); SetLength(LabelArray, 0); SetLength(EditArray, 0); End;
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Zеrg Дык учимся Не делает ошибки лишь тот, кто вообще ничего не делает
Я так понял, конструкция:
Код:
if QCount>0 then begin For i:=1 to QCount do begin QArray[i].Free; EditArray[i].Free; LabelArray[i].Free; end; end;
некорректна, да?
А как будет правильно?
Я вот попробовал массивы пронумеровать с "0"
и еще использовал "For i:=0 to QCount-1"
Результат я думаю понятен. Ничего не вышло
Помогите, народ! Добавлено спустя 7 минут, 46 секунд Максим Сделал как ты написал - "Access violation".
Member
Статус: Не в сети Регистрация: 03.01.2003 Откуда: Ростов-на-Дону
Xupyp1
Значит у тебя Delphi какае-то корявое, только что у себя компилировал код, предоставленный Максим, всё отлично работает.
Код:
procedure TForm1.Button1Click(Sender: TObject); const MaxCount = 20; var LabelArray:array of TLabel; EditArray:array of TEdit; I: Integer; my_obj: PObject; begin SetLength(LabelArray, MaxCount); SetLength(EditArray, MaxCount); for I := Low(LabelArray) to High(LabelArray) do begin if Assigned(LabelArray[I]) then begin my_obj := (LabelArray[i] as TLabel).ClassInfo; FreeAndNil(my_obj); end; end; SetLength(LabelArray, 0); SetLength(EditArray, 0); end;
У меня BDS2006
_________________ Just Zerg! Остановим деградацию русского языка, скажем нет удафкомовской лексике!!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Zеrg Секундочку. А что тут у тебя не написано, что ты эти объекты создаешь?! Конечно работать будет, так как везде записано nil Добавлено спустя 8 минут, 1 секунду Xupyp1 Твоя конструкция нормальна, просто все-таки надо каждый раз проверять с помощью Assigned(объект). Чтоб поменьше наталкиваться на Access Violation
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
if QCount>0 then begin ShowMessage('Have found '+IntToStr(QCount)+' components'); For i:= Low(QArray) To High(QArray)-1 Do begin if Assigned(QArray[i]) then begin my_obj := QArray[i].ClassInfo; FreeAndNil(my_obj); end;
if Assigned(EditArray[i]) then begin my_obj := EditArray[i].ClassInfo; FreeAndNil(my_obj); end;
if Assigned(LabelArray[i]) then begin my_obj := LabelArray[i].ClassInfo; FreeAndNil(my_obj); end; end; SetLength(QArray, 0); SetLength(LabelArray, 0); SetLength(EditArray, 0); end;
Есть варианты , если же делать так, как ты - с использованием массивов, то можно так. Особо не умничал - в процедуре _Create создается, в _Free соответственно освобождается.
type TForm1 = class(TForm) btnCreate: TButton; btnFree: TButton; procedure btnFreeClick(Sender: TObject); procedure btnCreateClick(Sender: TObject); private { Private declarations } public { Public declarations } b: boolean; aPnl: array of TPanel; aLbl: array of TLabel; aEdt: array of TEdit; procedure _Create(aOwner: TWinControl; pnlTop, pnlLeft, pnlWidth, pnlHeight: integer; Captions: TStrings); procedure _Free; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1._Create(aOwner: TWinControl; pnlTop, pnlLeft, pnlWidth, pnlHeight: integer; Captions: TStrings); var i: Integer; begin if b then _Free; SetLength(aPnl, Captions.Count); SetLength(aLbl, Captions.Count); SetLength(aEdt, Captions.Count); for i:= Low(aPnl) to High(aPnl) do begin aPnl[i]:= TPanel.Create(aOwner); aPnl[i].Top:= pnlTop; aPnl[i].Left:= pnlLeft; aPnl[i].Width:= pnlWidth; aPnl[i].Height:= pnlHeight; aPnl[i].Parent:= aOwner; aLbl[i]:= TLabel.Create(aPnl[i]); aLbl[i].Top:= 8; aLbl[i].Left:= 8; aLbl[i].Caption:= Captions.Strings[i]; aLbl[i].Parent:= (aPnl[i]); aEdt[i]:= TEdit.Create(aPnl[i]); aEdt[i].Top:= aLbl[i].Top + aLbl[i].Height; aEdt[i].Left:= aLbl[i].Left; aEdt[i].Width:= aPnl[i].Width - aLbl[i].Left * 2; aEdt[i].Tag:= i; // Для обработчиков событий, если будут добавлены. aEdt[i].Parent:= aPnl[i]; pnlTop:= pnlTop + pnlHeight; end; b:= true; end;
procedure TForm1._Free; var i: Integer; begin for i:= Low(aPnl) to High(aPnl) do begin aLbl[i].Free; aEdt[i].Free; aPnl[i].Free; end; SetLength(aLbl, 0); SetLength(aEdt, 0); SetLength(aPnl, 0); b:= false; end;
_SGK Все работает просто прекрастно!
Огромное спасибо!
Народ Кто-нить знает более продвиную замену RichEdit?
Ну, чтобы больше форматов документов понимал и т.п. Еще в RichEdit как-то странно переносы расставляются. Не совсем оптимально. Добавлено спустя 58 секунд
_SGK писал(а):
В случае необходимости aOwner для _Create, можно изменить на нужный, в твоем случае на TabSheet1
Да ладно тебе Я ведь не настолько зелен... или ...?
Member
Статус: Не в сети Регистрация: 16.04.2006 Откуда: d3d9.dll Фото: 7
А есть ли код, который добавляет имя автора и краткое описание к откомпиллированному ехе-шнику? Имеется ввиду что-то типа такого описания (см. скрин), которое выскакивает, когда наводишь курсор на ехе-шник.
#77 P. S. Скрин привёл просто для примера. То, что этот ехе-шник упакован NSIS'ом (а не откомпиллирован в Delphi) я прекрасно понимаю. Но интересует, есть ли такая возможность в Делфи 7?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения