Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизЗапутался в ООП Найти похожие ветки
← →
ызфт (2004-10-27 11:56) [0]Мастера, помогите советом.
Есть класс, в нём строка данных.
а еще в нем есть поток, у которого в Synchronize-функции стоит вызов функции класса проверки строки.
Компилятор ругается, this mettod call allowed only from class methods.
В чем ошибка?
← →
Amoeba © (2004-10-27 12:06) [1]Код в студию!
← →
Smithson (2004-10-27 12:06) [2]Ошибка в коде. Приведи его и тебе подскажут.
← →
span © (2004-10-27 12:19) [3]Вот клас
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) [4]Вот клас
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
← →
Digitman © (2004-10-27 12:23) [5]
> ругается он на GetTrack
GetTrack не является методом класса TMyThreadCardEntry, вот и "ругается"
← →
Span © (2004-10-27 12:24) [6]Извиняюсь,
procedure TMyThreadCardEntry.DoWork;
begin
If TSc.GetTrack then
begin
// terminate;
end;
end;
← →
Anatoly Podgoretsky © (2004-10-27 12:26) [7]Отсутствует реализация метода GetTrack.
← →
Span © (2004-10-27 12:31) [8]Метод GetTrack реализован в классе TSc
могу ли я к нему обращаться?
← →
panov © (2004-10-27 12:35) [9]Опять та же ошибка:
В метод Execute выполняется в отдельном потоке.
В таком виде
procedure TMyThreadCardEntry.Execute;
begin
while (not Terminated) and (Counter>0)do
Synchronize(DoWork);
end;
ты заставляешь DoWork выполняться в родительском потоке. А тебе ЭТО надо?
← →
panov © (2004-10-27 12:36) [10]>Span ©
По существу:
Как ты можешь обращаться к методу класса, экземпляр которого не создан?
← →
ЮЮ © (2004-10-27 12:36) [11]procedure TMyThreadCardEntry.DoWork;
begin
If GetTrack then
begin
// terminate;
end;
end;
что такое GetTrack в контексте метода TMyThreadCardEntry? Неизвестеый идентификатор!
begin
If TSc.GetTrack then
begin
// terminate;
end;
в этом случае GetTrack должен быть методом класса, а не объекта, каким он является по коду. моэтому нужен конкретный объект этого класса, у которого можно вызвать этот метод
← →
Span © (2004-10-27 12:38) [12]Так как мне вызвать метод класса из
DoWork
?
← →
TUser © (2004-10-27 12:39) [13]
> могу ли я к нему обращаться?
Нет не можешь. По крайней мере, если он похож на GetTrack2. Эта функция использует поля, а при TSc.GetTrack объекта еще нет - есть только класс. Поэтому и полей самих еще нет и нельзя вызывать такую ф-цию.
Надо сделать так - описать в потоке поле, в которое кладется ссылка на объект TSc, которому принадлежит данный объект-поток. Затем в наследнике TThread"а написать метод, который вызывает Parent.GetTrack и кладет результат в FTemp:string. А в DoWork сначала через Synch получить это значение, а потом уже писать if FTemp = "" then
← →
Anatoly Podgoretsky © (2004-10-27 12:47) [14]ЮЮ © (27.10.04 12:36) [11]
Почему неизвестный, вполне известный в одной из библиотек, а вот ниже должны быть еще сообщения об ошибке, о том, что отсутствует реализация метода и еще ниже об отсутствии определения метода GetTrack2
← →
Span © (2004-10-27 12:49) [15]GetTrack = GetTrack2, извиняюсь это одно и тоже
← →
panov © (2004-10-27 12:53) [16]Для использования функции или процедуры из класса без создания экземпляра класса эта функция/процедура должна быть объявлена функцией класса:
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;
← →
TUser © (2004-10-27 12:54) [17]
> GetTrack = GetTrack2, извиняюсь это одно и тоже
Тогда [13] - нельзя обратиться к методу объекта, который еще не создан. Можно только к м. класса, а в данном случае - как должна работать эта ф-ция, если ReceiveBuff еще не существует.
Кстати, реализовано это ужасно - есть функция pos, например.
← →
Anatoly Podgoretsky © (2004-10-27 13:02) [18]Слишком много кода, в котором надо догадываться, что соответсвуют оригиналу, а что нет.
Код сюда надо набивать не ручками, а копировать из программы!!!
← →
Span © (2004-10-27 13:10) [19]Там просто объём очень большой.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c