Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.035 c
1-1098387808
oleg_
2004-10-21 23:43
2004.11.07
dll


8-1091916682
negrila
2004-08-08 02:11
2004.11.07
Как узнать что в MemoryStream е?


1-1098378225
CeRBeR
2004-10-21 21:03
2004.11.07
Загрузка dll из реестра


1-1098700751
Strimer
2004-10-25 14:39
2004.11.07
Использование Project2 в Project1


3-1097480718
Воробьев_Иван
2004-10-11 11:45
2004.11.07
Все программы созданные мной на Delhi7 отказались работать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский