Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Два вопроса.   Найти похожие ветки 

 
Кириешки ©   (2004-08-11 14:51) [0]

1) Как обозначить кол-во объектов (например дисков) одним  
  символом?
2) Почему компилятор ругается после просмотра этой процедуры:

procedure LoadList(Listname : TListbox; Filename : pchar);
var
 FileStream: TFileStream;
 Reader: TReader;
begin
 if FileExists(Filename) then
 begin
try
 FileStream :=
   TFileStream.Create(Filename,
   fmOpenRead);
 Reader := TReader.Create(FileStream, $FF);
 Reader.ReadListBegin;
 Listname.items.Clear;
 while not Reader.EndOfList do
   Listname.items.Add(Reader.ReadString);
 Reader.ReadListEnd;
 finally
 Reader.Destroy;
 FileStream.Destroy;
end;
end;
end;

 
вот так :

[Warning] Main.pas(192): Variable "Reader" might not have been initialized
[Warning] Main.pas(193): Variable "FileStream" might not have been initialized


 
вразлет ©   (2004-08-11 14:53) [1]

Как обозначить кол-во объектов (например дисков) одним  
 символом?


q -quantity
n -number


 
Alx2 ©   (2004-08-11 14:54) [2]

2. Может не существовать то, к чему привязывается объект(ы)


 
Ega23 ©   (2004-08-11 14:55) [3]

1) Как обозначить кол-во объектов (например дисков) одним  
 символом?

N:char;

256 значений принимать может.

2) Почему компилятор ругается после просмотра этой процедуры:

Где конкретно ругается?


 
Рамиль ©   (2004-08-11 14:58) [4]


> 2) Почему компилятор ругается после просмотра этой процедуры:

Потому что внутри try ... end.


 
Плохиш ©   (2004-08-11 14:59) [5]

>Кириешки ©   (11.08.04 14:51)

2. Потому что, исключение в try ... finalle может возникнуть до создания "Reader" или "FileStream".


 
Ega23 ©   (2004-08-11 14:59) [6]

Потому что внутри try ... end.

Там finally стоит.


 
Плохиш ©   (2004-08-11 15:00) [7]


> Ega23 ©   (11.08.04 14:59) [6]
> Потому что внутри try ... end.
>
> Там finally стоит.

и что?


 
Юрий Зотов ©   (2004-08-11 15:04) [8]

> Кириешки ©   (11.08.04 14:51)  
> Почему компилятор ругается после просмотра этой процедуры:

try
 Obj := TMyObject.Create;
 ...
finally
 Obj.Free
end;

Если при вызове конструктора возникнет исключение, то переменная Obj не будет проинициализирована. Хуже того, выполнение перейдет в секцию finally и при попытке уничтожения так и не созданного объекта Вы получите вторую ошибку. Правильно так:

Obj := TMyObject.Create;
try
 ...
finally
 Obj.Free
end;


А в Вашем случае нужно использовать 2 вложенных блока try-finally:

Obj1 := TMyObject1.Create;
try
 Obj2 := TMyObject2.Create;
 try
   ...
 finally
   Obj2.Free
 end
finally
 Obj1.Free
end;


И не вызывайте деструктор, используйте Free.


 
Кириешки ©   (2004-08-11 15:30) [9]

Спасибо всем что ответили на второй вопрос! :)

А на счет первого вы не поняли! Мне надо обозначить не переменную внутри программы которой будет обозначаться кол-во - а, на форме, для пользователя. У меня есть едит, а над ним стоит лейбл. Едит маленький, всего два символа входит, а в лейбл не помещается слово "Кол-во" изиза того что он будет загораживать следубщий лейбл. А если использовать вместо слова "кол-во" знак "№", то он просто вводит в заблуждение пользователя. Так вот мне и нужно узнать как кол-во обозначить одним символом, ну или двумя. :))


 
Ega23 ©   (2004-08-11 15:31) [10]

Просто N


 
Кириешки ©   (2004-08-11 15:36) [11]

Ega23 ©   (11.08.04 15:31) [10]

Я пишу программу для одного человека занимающегося продажей CD.
Думаете поймет? А то он видь хелпы не читает, ему надо чтобы все интуитивно понятно было.


 
Vit@ly ©   (2004-08-11 15:44) [12]

Положи хинт на лейбл (любого размера)


 
Кириешки ©   (2004-08-11 15:52) [13]

>Юрий Зотов ©   (11.08.04 15:04) [8]

 Делаю так:


procedure LoadList(Listname : TListbox; Filename : pchar);
var
FileStream: TFileStream;
Reader: TReader;
begin
if FileExists(Filename) then
begin
try
 FileStream := TFileStream.Create(Filename,fmOpenRead);
   try
     Reader := TReader.Create(FileStream, $FF);

     Reader.ReadListBegin;
     Listname.items.Clear;

     while not Reader.EndOfList do
     Listname.items.Add(Reader.ReadString);
     Reader.ReadListEnd;

   finally
    Reader.Destroy;
   end;
finally
FileStream.Destroy;
end;
end;
end;


Все равно ругается :(((
Точно также. :(((((


 
Ega23 ©   (2004-08-11 15:58) [14]


try
 FileStream := TFileStream.Create(Filename,fmOpenRead);
 Reader := TReader.Create(FileStream, $FF);
 try
  Reader.ReadListBegin;
  Listname.items.Clear;

  while not Reader.EndOfList do
  Listname.items.Add(Reader.ReadString);
  Reader.ReadListEnd;
 finally
   Reader.Destroy;
   FileStream.Destroy;
 end;
except onE:Exception do
  ShowMessage(E.message);
end;


 
Ega23 ©   (2004-08-11 15:59) [15]

Reader.Destroy;
FileStream.Destroy;

Читать, как

Reader.Free;
FileStream.Free;


 
Юрий Зотов ©   (2004-08-11 16:03) [16]

> Кириешки ©   (11.08.04 15:52) [13]

> Все равно ругается :(((
> Точно также. :(((((

Естественно. Вы же ничего не изменили, вот ничего и не изменилось. Читайте [8] еще раз и ВНИМАТЕЛЬНО.


 
Mim1 ©   (2004-08-11 16:06) [17]


> procedure LoadList(Listname : TListbox; Filename : pchar);
> var
> FileStream: TFileStream;
> Reader: TReader;
> begin
> if FileExists(Filename) then
> begin
>  FileStream := TFileStream.Create(Filename,fmOpenRead);
> try
>      Reader := TReader.Create(FileStream, $FF);
>    try
>
>      Reader.ReadListBegin;
>      Listname.items.Clear;
>
>      while not Reader.EndOfList do
>      Listname.items.Add(Reader.ReadString);
>      Reader.ReadListEnd;
>
>    finally
>     Reader.free;
>    end;
> finally
> FileStream.free;
> end;
> end;
> end;


 
Кириешки ©   (2004-08-11 16:07) [18]

Ega23 ©   (11.08.04 15:59) [15]

Спасибо! :))

А почему вместо деструктора надо использовать Free?


 
Мастер ©   (2004-08-11 16:11) [19]

>Ega23 ©   (11.08.04 15:58) [14]
Неверно. Возможна утечка памяти.


 
Мастер ©   (2004-08-11 16:13) [20]

Ошибка возможна при возникновении ошибки(выделено):

try
FileStream := TFileStream.Create(Filename,fmOpenRead);
Reader := TReader.Create(FileStream, $FF);
try
 Reader.ReadListBegin;
 Listname.items.Clear;

 while not Reader.EndOfList do
 Listname.items.Add(Reader.ReadString);
 Reader.ReadListEnd;
finally
  Reader.Destroy;
  FileStream.Destroy;
end;
except onE:Exception do
 ShowMessage(E.message);
end


 
Ega23 ©   (2004-08-11 16:13) [21]

Спасибо! :))

Теоретически, там тоже неправильно. Если ошибка возникнет в конструкторе TReader.Create(FileStream, $FF); , то FileStream останется "неубитым". Ещё один блок надо-бы добавить...


 
Кириешки ©   (2004-08-11 16:14) [22]

Мастер ©   (11.08.04 16:11) [19]

> "Возможна утечка памяти."

 В результате чего? :(((


 
Ega23 ©   (2004-08-11 16:14) [23]

Мастер ©   (11.08.04 16:13) [20]
Сам заметил...   :о)


 
Мастер ©   (2004-08-11 16:15) [24]

>Кириешки ©   (11.08.04 16:07) [18]

А почему вместо деструктора надо использовать Free?

Потому что не надо плодить трудновыловимых ошибок.

При вызове Free сначала проверяется, не равен ли указательна объект nil, затем к нему применяется Destroy


 
Мастер ©   (2004-08-11 16:19) [25]

>Кириешки ©   (11.08.04 16:14) [22]

Вот здесь создан объект:
FileStream := TFileStream.Create(Filename,fmOpenRead);

Далее возникла ошибка(Exception) в строке
Reader := TReader.Create(FileStream, $FF);

Exception перехватывается, далее выполняется секция:
except onE:Exception do
ShowMessage(E.message);


Вот здесь созданный объект не будет уничтожен.


 
Кириешки ©   (2004-08-11 16:20) [26]

Так а как тогда совсем правильно сделать? Чтобы небыло ошибок?


 
Anatoly Podgoretsky ©   (2004-08-11 16:23) [27]

Пользуйся тегом КОД не удобно же читать.


 
Danilka ©   (2004-08-11 16:25) [28]

[9] Кириешки ©   (11.08.04 15:30)
> Едит маленький, всего два символа входит, а в лейбл не помещается
> слово "Кол-во" изиза того что он будет загораживать следубщий
> лейбл.

Честно говоря, перегруженая элементами форма не есть хорошо, а наоборот, ИМХО.


 
Кириешки ©   (2004-08-11 16:26) [29]

Anatoly Podgoretsky ©   (11.08.04 16:23) [27]

Он у меня только иногда работает, а иногда мне говорят :
"Под NN не работает".


 
Мастер ©   (2004-08-11 16:27) [30]

>Кириешки ©   (11.08.04 16:20) [26]

Ю.Зотов в [8] ведь нарисовал схему.


 
Мастер ©   (2004-08-11 16:29) [31]


> Кириешки ©   (11.08.04 16:26) [29]


Он у меня только иногда работает, а иногда мне говорят :
"Под NN не работает".


А ты руками вставляй тэги - <СODE> </СODE>


 
Кириешки ©   (2004-08-11 16:33) [32]

Danilka ©   (11.08.04 16:25) [28]
Она у меня не перегружена.

Мастер ©   (11.08.04 16:27) [30]

Я по этой схеме делаю, ставлю Free, а он все равно ругается.  
Делаю теперь так :

<СODE>
procedure LoadList(Listname : TListbox; Filename : pchar);
var
FileStream: TFileStream;
Reader: TReader;
begin
if FileExists(Filename) then
begin
try
FileStream := TFileStream.Create(Filename,fmOpenRead);
  try
   Reader := TReader.Create(FileStream, $FF);

   Reader.ReadListBegin;
   Listname.items.Clear;

   while not Reader.EndOfList do
   Listname.items.Add(Reader.ReadString);
   Reader.ReadListEnd;

  finally
 Reader.free;
end;
finally
FileStream.free;
end;
end;
end;
</СODE>

вроде все по схеме: создаю по очереди два объекта, и по очереди их освобождаю...
Или я просто что-то не понимаю? :(


 
Кириешки ©   (2004-08-11 16:35) [33]

Теги то не работают!


 
Мастер ©   (2004-08-11 16:38) [34]

Вот так у Ю.Зотова:

Obj1 := TMyObject1.Create;
try
Obj2 := TMyObject2.Create;
try
  ...
finally
  Obj2.Free;
end;
finally
Obj1.Free;
end;


Вот так у тебя:


try
 Obj1 := TMyObject1.Create;
 try
   Obj2 := TMyObject2.Create;
   ...
 finally
   Obj2.Free;
 end;
finally
  Obj1.Free;
end;


 
Мастер ©   (2004-08-11 16:39) [35]


> Кириешки ©   (11.08.04 16:35) [33]
> Теги то не работают!


А ты руками набери, не копируя-)


 
Мастер ©   (2004-08-11 16:42) [36]

В общем, в итоге у тебя должен был получиться такой код:

procedure LoadList(Listname : TListbox; Filename : pchar);
var
FileStream: TFileStream;
Reader: TReader;
begin
 if FileExists(Filename) then
 begin
   FileStream := TFileStream.Create(Filename, fmOpenRead);
   try
     Reader := TReader.Create(FileStream, $FF);
     try
       Reader.ReadListBegin;
       Listname.items.Clear;
       while not Reader.EndOfList do Listname.items.Add(Reader.ReadString);
       Reader.ReadListEnd;
     finally
       Reader.Free;
     end;
   finally
    FileStream.Free;
   end;
 end;
end;


 
Кириешки ©   (2004-08-11 16:49) [37]

Извините.
Вот блин, а...
Даже не удобно как-то...

Спасибо. :)

ЗЫ.Я еще минуты две назад ответ написал - но с сервером небыло связи. А как исправить я сразу понял когда вчитался.

А почему теги у меня не работают когда я их ручками вписываю?


 
Кириешки ©   (2004-08-11 16:50) [38]

БОЛЬШОЕ ВСЕМ СПАСИБО!!! :)))


 
Ega23 ©   (2004-08-11 16:51) [39]

строчными буквами пиши, а не заглавными.


 
Кириешки ©   (2004-08-11 16:55) [40]

Попробую...


l := char(#13)+char(#10);
k := Pos(char(#08), s);
while k <> 0 do
begin
   Delete(s,k,1);
   Insert(l,s,k);
   k := Pos(char(#08), s);
end;
БЮ


 
Кириешки ©   (2004-08-11 16:56) [41]

ОК!!!



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

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.036 c
14-1091964547
Кириешки
2004-08-08 15:29
2004.08.29
Где в WinMe находится "настоящий" autoexec.bat ?


1-1092657743
dracula
2004-08-16 16:02
2004.08.29
ValueListEditor


9-1084134759
Werwolf
2004-05-10 00:32
2004.08.29
Ко всем программерам и не только вопрос


8-1086771174
Юля
2004-06-09 12:52
2004.08.29
*.cdr , *.pdf - изображения в Image


11-1079975222
DillerXX
2004-03-22 20:07
2004.08.29
Power