Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Запутался в ООП   Найти похожие ветки 

 
ызфт   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
1-1098164882
denis24
2004-10-19 09:48
2004.11.07
определение свойств


14-1098197444
Pat
2004-10-19 18:50
2004.11.07
Расширение или переделка?


14-1098294434
Vasya.ru
2004-10-20 21:47
2004.11.07
Программа поиска мата в 3 хода (шахматы)


14-1098256027
Cl
2004-10-20 11:07
2004.11.07
Ваши впечатления от Delphi8


1-1098704468
PURGEN
2004-10-25 15:41
2004.11.07
Процедура