Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
Кириешки ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.024 c
1-1092665101
Zhilkin
2004-08-16 18:05
2004.08.29
Шаблоны текста


3-1091623108
Shama_n
2004-08-04 16:38
2004.08.29
Как получить кол-во записей удовлетворяющих условию


14-1092037685
Карелин Артем
2004-08-09 11:48
2004.08.29
Спамеры без башни.


1-1092570397
mOOx
2004-08-15 15:46
2004.08.29
Выделение цветом в ListView


14-1092300234
SSSSS
2004-08-12 12:43
2004.08.29
Люди! Где взять лицензионную 5-ю Дельфу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский