Форум: "Потрепаться";
Текущий архив: 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