![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запутался в ООП [D5]
ызфт © (2004-10-27 11:56:00)Мастера, помогите советом.
Есть класс, в нём строка данных.
а еще в нем есть поток, у которого в Synchronize-функции стоит вызов функции класса проверки строки.
Компилятор ругается, this mettod call allowed only from class methods.
В чем ошибка?
Span (2004-10-27 13:10:00) [1]Там просто объём очень большой.
Anatoly Podgoretsky (2004-10-27 13:02:00) [2]Слишком много кода, в котором надо догадываться, что соответсвуют оригиналу, а что нет.
Код сюда надо набивать не ручками, а копировать из программы!!!
TUser (2004-10-27 12:54:00) [3]
> GetTrack = GetTrack2, извиняюсь это одно и тоже
Тогда [13] - нельзя обратиться к методу объекта, который еще не создан. Можно только к м. класса, а в данном случае - как должна работать эта ф-ция, если ReceiveBuff еще не существует.
Кстати, реализовано это ужасно - есть функция pos, например.
panov (2004-10-27 12:53:00) [4]Для использования функции или процедуры из класса без создания экземпляра класса эта функция/процедура должна быть объявлена функцией класса:
T1=class
class procedure TestT1;
end;
T2=class
procedure TestT2;
end;
{ T1 }
class procedure T1.TestT1;
begin
ShowMessage('!');
end;
{ T2 }
procedure T2.TestT2;
begin
T1.TestT1;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
with T2.Create do
begin
T1.TestT1;
Free;
end;
end;
Span (2004-10-27 12:49:00) [5]GetTrack = GetTrack2, извиняюсь это одно и тоже
Anatoly Podgoretsky (2004-10-27 12:47:00) [6]ЮЮ © (27.10.04 12:36) [11]
Почему неизвестный, вполне известный в одной из библиотек, а вот ниже должны быть еще сообщения об ошибке, о том, что отсутствует реализация метода и еще ниже об отсутствии определения метода GetTrack2
TUser (2004-10-27 12:39:00) [7]
> могу ли я к нему обращаться?
Нет не можешь. По крайней мере, если он похож на GetTrack2. Эта функция использует поля, а при TSc.GetTrack объекта еще нет - есть только класс. Поэтому и полей самих еще нет и нельзя вызывать такую ф-цию.
Надо сделать так - описать в потоке поле, в которое кладется ссылка на объект TSc, которому принадлежит данный объект-поток. Затем в наследнике TThread'а написать метод, который вызывает Parent.GetTrack и кладет результат в FTemp:string. А в DoWork сначала через Synch получить это значение, а потом уже писать if FTemp = '' then
Span (2004-10-27 12:38:00) [8]Так как мне вызвать метод класса из
DoWork?
panov (2004-10-27 12:36:00) [9]>Span ©
По существу:
Как ты можешь обращаться к методу класса, экземпляр которого не создан?
ЮЮ (2004-10-27 12:36:00) [10]procedure TMyThreadCardEntry.DoWork;
begin
If GetTrack then
begin
// terminate;
end;
end;
что такое GetTrack в контексте метода TMyThreadCardEntry? Неизвестеый идентификатор!
begin
If TSc.GetTrack then
begin
// terminate;
end;
в этом случае GetTrack должен быть методом класса, а не объекта, каким он является по коду. моэтому нужен конкретный объект этого класса, у которого можно вызвать этот метод
panov (2004-10-27 12:35:00) [11]Опять та же ошибка:
В метод Execute выполняется в отдельном потоке.
В таком виде
procedure TMyThreadCardEntry.Execute;
begin
while (not Terminated) and (Counter>0)do
Synchronize(DoWork);
end;
ты заставляешь DoWork выполняться в родительском потоке. А тебе ЭТО надо?
Span (2004-10-27 12:31:00) [12]Метод GetTrack реализован в классе TSc
могу ли я к нему обращаться?
Anatoly Podgoretsky (2004-10-27 12:26:00) [13]Отсутствует реализация метода GetTrack.
Span (2004-10-27 12:24:00) [14]Извиняюсь,
procedure TMyThreadCardEntry.DoWork;
begin
If TSc.GetTrackthen
begin
// terminate;
end;
end;
Digitman (2004-10-27 12:23:00) [15]
> ругается он на GetTrack
GetTrack не является методом класса TMyThreadCardEntry, вот и "ругается"
span (2004-10-27 12:19:00) [16]Вот клас
TSc = class
Constructor init(PName:String; pBaud:Cardinal;
Function GetTrack:string;
Procedure Execute;
Destructor done;
Private
Public
ReceiveBuff:string;
Protected
CardEntryThread:TMyThreadCardEntry;
end;
А ф-я, запускающая поток
Procedure TSc5000.execute;
begin
CardEntryThread:=TMyThreadCardEntry.create(100);
end
И функция из Synchronize
Function TSc5000.GetTrack2:string;
var
i, j:Integer;
begin
For i:=1 to Length(ReceiveBuff) do If ReceiveBuff[i] = ';' then
begin
result:=ReceiveBuff;
end;
end;//end---------GetTrack2-------------
А вот описание потока
TMyThreadCardEntry = class(TThread)
Private
Counter:integer;
Timer:TTimer;
public
constructor create(timeout:integer);
protected
Procedure DecCounter(Sender:TObject);
procedure Execute; override;
Procedure DoWork;
Destructor free;
end;
procedure TMyThreadCardEntry.Execute;
begin
while (not Terminated) and (Counter>0)do
Synchronize(DoWork);
end;
procedure TMyThreadCardEntry.DoWork;
begin
If GetTrack then
begin
// terminate;
end;
end;
И ругается он на GetTrack
span (2004-10-27 12:19:00) [17]Вот клас
TSc = class
Constructor init(PName:String; pBaud:Cardinal;
Function GetTrack:string;
Procedure Execute;
Destructor done;
Private
Public
ReceiveBuff:string;
Protected
CardEntryThread:TMyThreadCardEntry;
end;
А ф-я, запускающая поток
Procedure TSc5000.execute;
begin
CardEntryThread:=TMyThreadCardEntry.create(100);
end
И функция из Synchronize
Function TSc5000.GetTrack2:string;
var
i, j:Integer;
begin
For i:=1 to Length(ReceiveBuff) do If ReceiveBuff[i] = ';' then
begin
result:=ReceiveBuff;
end;
end;//end---------GetTrack2-------------
А вот описание потока
TMyThreadCardEntry = class(TThread)
Private
Counter:integer;
Timer:TTimer;
public
constructor create(timeout:integer);
protected
Procedure DecCounter(Sender:TObject);
procedure Execute; override;
Procedure DoWork;
Destructor free;
end;
procedure TMyThreadCardEntry.Execute;
begin
while (not Terminated) and (Counter>0)do
Synchronize(DoWork);
end;
procedure TMyThreadCardEntry.DoWork;
begin
If GetTrack then
begin
// terminate;
end;
end;
И ругается он на GetTrack
Amoeba (2004-10-27 12:06:00) [18]Код в студию!
Smithson (2004-10-27 12:06:00) [19]Ошибка в коде. Приведи его и тебе подскажут.