Содержание
- Tstrings delphi abstract error
- Tstrings delphi abstract error
- Tstrings delphi abstract error
- Tstrings delphi abstract error
- Tstrings delphi abstract error
Tstrings delphi abstract error
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
С этим типом у Вас проблем станет меньше.
Air, не очень хороший совет. Проблем станет меньше, а работы больше.
В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
Air, не очень хороший совет. Проблем станет меньше, а работы больше.
В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.
Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы — это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету «использовать всегда тип TStringList, потому что меньше проблем» следовать не нужно.
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.
Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы — это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету «использовать всегда тип TStringList, потому что меньше проблем» следовать не нужно.
Учитывая приведённые Вами данные, я предположил, что использование одной переменной (скажем «D») тита TStream в разных частях кода можно использовать как TFileStream и TMemoryStream.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
Из этого я понял, что можно обьявить один тип TStream, а не описывать каждый, с отдельной переменной.
Источник
Tstrings delphi abstract error
Всем меньше сбоев в компиляторе, вопрос такой. Конечно глупый, но, думаю, распространенный.
Хочу использовать класс TStrings (Classes) и в следующем коде
var s: TStrings;
begin
s.LoadFromFile(«xxx.txt»);
end;
выдает ошибку «Abstract Error». Как правильно пользоваться этим классом?
← →
Андрей Прокофьев ( 2002-09-19 12:59 ) [1]
← →
Separator ( 2002-09-19 13:00 ) [2]
← →
qube ( 2002-09-19 13:04 ) [3]
TStrings — абстрактный класс.
← →
Oxy2 ( 2002-09-19 13:06 ) [4]
TStrings это абстрактный класс. Его нельзя использовать на прямую. Все его методы должны быть перекрыты в его потомках. Таких например как TStringList. Более подробно можешь прочитать в хелпе.
Источник
Tstrings delphi abstract error
вот я в процедуре объявляю переменную типа TStrings и создаю ее, мне нужно в нее загрузить строки из файла, чтобы потом этот TStrings передать параметром в другую процедуру
procedure TMainForm.FileOpenActionExecute(Sender: TObject);
var FLLChild: TLogListChild;
L: TStrings;
begin
OpenDialog.DefaultExt:=»*.llf»;
OpenDialog.Filter:=»Log list files (*.llf)|*.llf»;
OpenDialog.Options := [ofEnableSizing];
if OpenDialog.Execute then begin
try
FLLChild := TLogListChild.Create(Application);
FLLChild.Caption := OpenDialog.FileName;
try
l := TStrings.Create;
l.LoadFromFile(OpenDialog.FileName);
FLLChild.LoadFileList(L);
finally
l.Free;
end;
except
Application.MessageBox(PChar(«Error read file.»),»Error»,1);
end;
end;
end;
и при загрузке из файла у меня получается ошибка Abstract Error.
. я так понял, что эта переменная l не принадлежит форме (так чтоли?) поэтомй ошибка. Подскажите пожалуйста, как ее избежать?
← →
MBo ( 2003-05-23 09:14 ) [1]
TStrings — абстрактный класс, и компилятор об этом пердупредить должен
l := TStrings List.Create;
← →
Андрей ( 2003-05-23 09:24 ) [2]
← →
Palladin ( 2003-05-23 09:26 ) [3]
да, иногда нужно обращать внимание на то что пишется внизу
Источник
Tstrings delphi abstract error
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
С этим типом у Вас проблем станет меньше.
Air, не очень хороший совет. Проблем станет меньше, а работы больше.
В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
Air, не очень хороший совет. Проблем станет меньше, а работы больше.
В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.
Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы — это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету «использовать всегда тип TStringList, потому что меньше проблем» следовать не нужно.
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.
Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы — это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету «использовать всегда тип TStringList, потому что меньше проблем» следовать не нужно.
Учитывая приведённые Вами данные, я предположил, что использование одной переменной (скажем «D») тита TStream в разных частях кода можно использовать как TFileStream и TMemoryStream.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
Из этого я понял, что можно обьявить один тип TStream, а не описывать каждый, с отдельной переменной.
Источник
Tstrings delphi abstract error
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
Люди не мучайтесь, когда-то и я мучался, но мне дали хороший совет и я Вам его передаю.
С этим типом у Вас проблем станет меньше.
Air, не очень хороший совет. Проблем станет меньше, а работы больше.
В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
Air, не очень хороший совет. Проблем станет меньше, а работы больше.
В приведенном примере еще ладно, но как думаете, в исходниках VCL почему в методах для объявления параметров используются абстрактные классы ?
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.
Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы — это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету «использовать всегда тип TStringList, потому что меньше проблем» следовать не нужно.
Был не понят. Попробую поподробнее. Я не о посте Никки, а о Вашем совете. Сравните ответ Po4koff и Ваш.
Объявлять переменные можно и нужно абстрактного класса. А вот создавать объекты нужно используя только конкретный класс. Советовать использовать всегда только конкретные классы — это ошибка, хотя это безусловно работает. Но это как-раз та самая ошибка проектирования, которая нам так дорого обходится в дальнейшем.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
То есть Ваш пример отличен и, надеюсь, у Никки все получилось, но, не в обиду будет сказано, Вашему совету «использовать всегда тип TStringList, потому что меньше проблем» следовать не нужно.
Учитывая приведённые Вами данные, я предположил, что использование одной переменной (скажем «D») тита TStream в разных частях кода можно использовать как TFileStream и TMemoryStream.
Приведу пример. Тот-же VCL (исходный код которого всегда полезно смотреть). Многие классы имеют методы записи/чтения в файл. Эти методы использованы с использованием абстрактного класса TStream. Ведь если бы использовались конкретные классы (TFileStream или TMemoryStream) методов было бы больше — для каждого конкретного класса.
Из этого я понял, что можно обьявить один тип TStream, а не описывать каждый, с отдельной переменной.
Источник
Ошибка ‘Abstract Error’
, Возникает при пересылке
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Подскажите, плиз, в чем проблема. Вываливается «Абстрактная ошибка»…
procedure ListFileDir(Path: string; FileList: TStrings); var SR: TSearchRec; begin if FindFirst(Path + ‘*.*’, faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin if (sr.Attr and faDirectory)<>0 then FileList.Add(‘+ папка ‘+SR.Name) else if (sr.Attr and faHidden)<>0 then FileList.Add(‘ — файл ‘+SR.Name+’ размер: ‘+inttostr(SR.Size)+’байт — скрытый’) else if (sr.Attr and faSysFile)<>0 then FileList.Add(‘ — файл ‘+SR.Name+’ размер: ‘+inttostr(SR.Size)+’байт — системный’) else FileList.Add(‘ — файл ‘+SR.Name+’ — ‘+inttostr(SR.Size)); end; until FindNext(SR) <> 0; FindClose(SR); end; end; var subdirs: TStrings; separ: ‘#10’; if copy(sub_str,1,i-1)=’dirlist’ then begin sub_str:=copy(s,i+3,length(s)-i+3); // здесь идет значение, например ‘C:’ subdirs:= TStrings.Create; ListFileDir(sub_str, subdirs); subdirs.Insert(0,’dirlist’+separ); // #10 — разделитель в строке memStr:= TMemoryStream.Create; memStr.Position:=0; subdirs.SaveToStream(memStr); memStr.Position:=0; Socket.SendStream(memStr); // здесь отправляется на клиент … end … но почему то происходит ошибка ‘Abstract Error’ на стороне сервера. |
Яичница |
|
Full Member Рейтинг (т): 43 |
Замените TStrings на TStringList.
var subdirs: TStringList; …………………… subdirs:= TStringList.Create; …………………………… end Цитата … но почему то происходит ошибка ‘Abstract Error’ на стороне сервера. …. дык…» TStrings contains abstract methods and should not be directly instantiated.»(с) Сообщение отредактировано: Тестировщица — 13.12.05, 05:38 |
Rouse_ |
|
Moderator Рейтинг (т): 320 |
Достаточно вот этой строчки: subdirs:= TStringList.Create; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Сетевое программирование
- Следующая тема
[ Script execution time: 0,0575 ] [ 16 queries used ] [ Generated: 10.02.23, 04:18 GMT ]
TStrings *is* an abstract class. Here’s a heavily commented class
demonstrates the reason why you would want to declare a property as the
abstract TStrings class, but instantiate it as a non-abstract TStrings
descendant:
TBrianClass = class(TObject)
private
FItems : TStrings; { Note: TStrings, not TStringList }
procedure SetItems(Value: TStrings);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Items: TStrings read FItems write SetItems;
end;
constructor TBrianClass.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{
TStrings is an ABSTRACT class, which means it has methods
which are declared «virtual; abstract;». Abstract methods
are not implemented, and MUST be implemented by descendants.
The TStrings methods which are abstract relate to the actual
storage mechanism for the string and object values.
Because TStrings is abstract, we MUST NOT instantiate it.
Any statement such as FItems := TStrings.Create; will result
in a compiler or run-time error (depending on the version of
Delphi) because the abstract methods have not been
implemented.
We declared our property a TStrings, however, because we
would like the property to be type-compatible with any
TStrings descendant. Remember that descendant classes are
always type-compatible with their ancestors. TStringList is
just one example of a TStrings descendant; the VCL includes
many others, such a TMemoStrings and TListBoxStrings.
The reason the VCL includes the TStrings abstract class is
to provide a common interface to a list of strings, even
though the underlying storage mechanism of those strings is
different from class to class. So TStringList maintains
strings in a TList structure, while TMemoStrings uses the
Windows API to store the strings right in the Microsoft
Windows common memo control.
Since we cannot instantiate the TStrings class, the next
statement creates a TStringList instance and assigns it to
FItems. This is OK because descendants are type-compatible
with ancestors. This technique gives us the best of both
worlds — the property uses the generic and abstract
TStrings interface, and the internal class field uses the
TStringList class, which manages the string/object storage. }
FItems := TStringList.Create;
end;
destructor TBrianClass.Destroy; override;
begin
FItems.Free;
inherited Destroy;
end;
procedure TBrianClass.SetItems(Value: TStrings);
begin
{
The Value parameter can be any TStrings descendant,
including TStringList, TMemoStrings, TListBox strings,
etc.
The Assign method is a special TPersistent method which
by default does nothing but raise an exception. This
method is virtual, which means descendant classes can
override it to provide appropriate «copy semantics» for
the class.
In this case, the TStrings ancestor class overrides Assign
and loops through the strings, copying the string/object
pairs from the source TStrings to the destination TStrings.
It doesn’t matter what TStrings descendant the source or
destination are, because the Assign method uses the base
interface methods which are implemented in the ancestor
itself, TStrings. This is another example of why abstract
classes are great.
So in this case, you could assign any TStrings descendant
to the Items property of a TBrianClass instance like this:
BrianClass.Items := Memo1.Lines;
BrianClass.Items := ListBox1.Items;
BrianClass.Items := MyStringList;
&etc.
}
FItems.Assign(Value);
end;
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan |
Поиск: |
|
Использование TStrings, появляется ошибка «Abstract error» |
Опции темы |
Первый |
|
||
Новичок Профиль Репутация: нет
|
Подскажите пожалуйста как правильно использовать TStrings? Есть код
Что нужно сделать, чтобы все заработало? |
||
|
|||
volvo877 |
|
||
Эксперт Профиль Репутация: 14
|
Работать не с абстрактным классом TStrings, а с его наследником, например, TStringList:
Это сообщение отредактировал(а) volvo877 — 26.8.2006, 19:59 |
||
|
|||
Первый |
|
||
Новичок Профиль Репутация: нет
|
Спасибо, все работает. Но вот теперь возникает другая ошибка.
Что я делаю не так? |
||
|
|||
Matematik |
|
||
Эксперт Профиль Репутация: 17
|
Создается так |
||
|
|||
Первый |
|
||
Новичок Профиль Репутация: нет
|
Спасибо, это я затупил. Уже разобрался … |
||
|
|||
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |