Форум: "Основная";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизПроблема при использовании LoadFromFile у TStrings Найти похожие ветки
← →
Иванько (2003-10-15 18:29) [0]Фрагмент кода:
procedure TForm1.Button1Click(Sender: TObject);
var sss:Tstrings;
begin
opendialog1.Execute; sss.LoadFromFile(opendialog1.FileName);
end;
вызывает ошибку:
Debugger Exception Notification
Project Project1.exe raised exception class EAccessViolation with message "Access violation at address 004554B3 in module "PROJECT1.EXE". Read of address 8BD88BBB". Process stopped. Use Step or Run to continue.
в то же время RichEdit1.Lines.LoadFromFile или Memo1.Lines.LoadFromFile проходят без проблем. Пробовал вначале создать объект:
opendialog1.Execute; sss.Create; sss.LoadFromFile(opendialog1.FileName);
такой же результат. Компилировал под разными ОС (98, Ме, ХР) и разными версиями Delphi (6, 7) – не помогает. В справке про это ничего не сказано. Кто что может посоветовать????
← →
Skier (2003-10-15 18:31) [1]Ну ё !
procedure TForm1.Button1Click(Sender: TObject);
var
sss:Tstrings;
begin
sss := TstringList.Create;
try
if opendialog1.Execute then
sss.LoadFromFile(opendialog1.FileName);
finally
sss.Free;
end; //try
end;
← →
default (2003-10-15 18:32) [2]delphi uninstall, ИМХО
← →
Иванько (2003-10-15 18:34) [3]Мы все учились понемногу.... (с) Пушкин.
А вообще биг сянкс!
← →
default (2003-10-15 18:52) [4]Иванько © (15.10.03 18:34) [3]
вот тебе дали решение и ты успокоился...ты понял почему переменная объявлена как TStrings, а создаётся объект через ссылку на класс TStringList и это работает?!...
← →
Иванько (2003-10-16 18:39) [5]Неа... Плиз, объясни!
← →
AlexS (2003-10-16 18:52) [6]TStrings - полуфабрикат, базовый класс, у него многие методы абстрактные, поэтому лучше работать с TStringList.
← →
default (2003-10-16 18:54) [7]Иванько © (16.10.03 18:39) [5]
моё личное убеждение в том, что чтобы до конца понять принцип работы объектов надо смотреть окно отладчика, то есть хоть чуть-чуть разбираться в ассемблерном коде
а так могу попробовать объяснить так:
использовать TStrings.LoadFormFile и большинство других методов этого класса нельзя, потому что они не определены в этом классе, а оставлены для определения в потомках, то есть TStrings является каркасом для них, чтобы меньше кода писать, а определять в наследниках этого класса то что надо или дополнить что-то(или изменить)
поэтому при вызове этих методов происходит Abstract Error(фактически на месте адреса кода метода лежит адрес кода процедуры обработки вот такого абстрактного вызова, которая и выводит текст об ошибке вызова),
присвоении sss := TstringList.Create вполне логично так как TStringList является потомком TStrings и в нём этот(и другие)
абстрактные методы определены, а компилятор "работает" с объектом через указатель на него, а указатель у нас на TStringList теперь хранится в переменной sss и поэтому всё чики пуки происходит, вот если понадобится вызвать "новые" методы TStringList придётся выполнять приведение к типу TStringList
не знаю понятно или нет, конечно, но всё же надеюсь не зря писал...
← →
Иванько (2003-10-16 19:11) [8]вроде понятно... Пасибо, что вразумил! Я в принципе так и думал, но все равно толково и ястно рассказал!
← →
mOOx_ (2003-10-16 19:44) [9]Блин, когда-то и я так радовался. Правда откопал эту фишку в хелпах :). Всегда приятно, когда кто-то догоняет :). Удачи.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c