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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2009, 11:37   #1
m9ss
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию Нужна помощь в поиске ошибки

Написана маленькая прога, код ниже, все работает, но только как я на форму добавляю Button, при выполнении процедуры Tform1.LabelClick, условия else (если конктретней то после последней labels[a].free) выскакивает следующая ошибка :


понять не могу в чем причина, без button все прекрасно работает.



Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    procedure FormCreate(Sender: TObject);
    procedure filelist(dir:string);
  protected
    procedure LabelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  ln: integer;
  path: string;
  labels: array[1..100] of Tlabel;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
path:=extractfilepath(paramstr(0))+'docs\';
form1.Width:=800;
form1.Height:=600;
form1.Top:=(screen.Height div 2) - (form1.Height div 2);
form1.Left:=(screen.Width div 2) - (form1.Width div 2);
ScrollBox1.Width:=form1.Width-5;
ScrollBox1.Height:=450;
ScrollBox1.Top:=80;
ScrollBox1.left:=0;
filelist(path);
end;

procedure TForm1.filelist(dir:string);
var search: TSearchRec;
begin
ln:=0;
if FindFirst(dir+'\*.*', faAnyFile, search) = 0 then
begin
  repeat
    if (search.Name<>'.') and (search.Name<>'..') then
    begin
      ln:=ln+1;
      labels[ln]:=Tlabel.Create(self);
      labels[ln].OnClick:=form1.LabelClick;
      labels[ln].caption:=search.Name;
      labels[ln].Parent:= TWinControl(ScrollBox1);
      labels[ln].Left:=10;
      labels[ln].Top:=ln*20;
    end;
  until FindNext(search) <> 0;
FindClose(search);
end;
end;


procedure Tform1.LabelClick(Sender: TObject);
var filename: TSearchRec;
    a:integer;
begin
if FindFirst(path+(Sender as TLabel).Caption, faAnyFile, filename) = 0 then
begin
  if filename.Attr <> faDirectory
     then ShellExecute(Application.Handle,'Open',PChar(path+(Sender as TLabel).Caption),Nil,Nil,SW_SHOWDEFAULT)
     else begin
       for a:=1 to ln do labels[a].free;
       path:=path+(Sender as TLabel).Caption+'/';
       filelist(path);
     end;

end;
FindClose(filename);

end;

end.
P.S. Delphi 7

Последний раз редактировалось m9ss; 05.03.2009 в 11:45.
m9ss вне форума Ответить с цитированием
Старый 05.03.2009, 11:40   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Не может метка в своем собственном обработчике освободить память от самой себя.
Это то же самое, что умерший человек будет сам себя закапывать.
mihali4 вне форума Ответить с цитированием
Старый 05.03.2009, 11:51   #3
m9ss
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

хммм.. действительно, спасибо, в делфи я не силен, сам бы не заметил. Странно что без button все работает.Неподскажете как это обойти ? мне нужно делать free сразу же после клика, но как это сделать после обработчика а не в нем ?

Последний раз редактировалось m9ss; 05.03.2009 в 11:55.
m9ss вне форума Ответить с цитированием
Старый 05.03.2009, 12:12   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мне нужно делать free сразу же после клика, но как это сделать после обработчика а не в нем ?
А почему? Чего до закрытия формы подождать не можеш?
Может ты хочеш чтоб по клику исчез компонент, так просто Visible:=false ставь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.03.2009, 12:19   #5
m9ss
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему? Чего до закрытия формы подождать не можеш?
Может ты хочеш чтоб по клику исчез компонент, так просто Visible:=false ставь.
За память беспокоюсь, в 2 ух словах функция этой программы - проводник, очень много компонентов придется создавать
m9ss вне форума Ответить с цитированием
Старый 05.03.2009, 12:43   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Я думаю, не будет ничего страшного, если вы процедуру высвобождения памяти вынесете в обработчик таймера, который и будете запускать в том месте, где у вас сейчас она находится. Только не забудьте первой операцией в обработчике сделать Timer.Enabled:=False;
mihali4 вне форума Ответить с цитированием
Старый 05.03.2009, 13:14   #7
m9ss
 
Регистрация: 14.12.2008
Сообщений: 9
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Я думаю, не будет ничего страшного, если вы процедуру высвобождения памяти вынесете в обработчик таймера, который и будете запускать в том месте, где у вас сейчас она находится. Только не забудьте первой операцией в обработчике сделать Timer.Enabled:=False;
Спасибо за совет все прекрасно работает.
m9ss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется срочная помощь по устранению ошибки Basset Microsoft Office Access 1 28.10.2008 20:24
Нужна срочная помощь немогу найти свои ошибки delphin100 Общие вопросы Delphi 3 03.06.2008 08:38
СРОЧНО!!!Нужна помощь в поиске движка для форума!!! ALEXBAZ PHP 2 16.05.2008 15:08