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

Вниз

Можно ли управлять классом через TComponent ?   Найти похожие ветки 

 
Zoom ©   (2010-05-15 19:46) [0]

var
 TCPClient: TIdTCPClient;
 AOwner: TComponent;
begin
 TCPClient := TIdTCPClient.Create(self);
 AOwner := TCPClient.Owner;
 TIdTCPClient(AOwner).Connect("127.7.0.1", 3615);
 TIdTCPClient(AOwner).IOHandler.Write("Hello");
end;

Access violation at address... а почему ?

существует ли у класса некое подобие handle, зная которое можно управлять классом например из других классов ?


 
Плохиш ©   (2010-05-15 20:14) [1]


>  AOwner := TCPClient.Owner;
>  TIdTCPClient(AOwner).Connect("127.7.0.1", 3615);
>

Какое отношение ваш self имеет к классу TIdTCPClient, что вы его к нему приводите?


 
~AQUARIUS~ ©   (2010-05-15 20:29) [2]

var
 TCPClient: TIdTCPClient;
 c: TComponent;
begin
 TCPClient := TIdTCPClient.Create(self);
 TCPClient.Name := {уникальное имя};
 c := FindComponent({ранее указанное имя});
 if Assigned(c) then
 begin
  TIdTCPClient(c).Connect("127.7.0.1", 3615);
  TIdTCPClient(c).IOHandler.Write("Hello");
 end;
end;


 
Харакири   (2010-05-15 21:36) [3]

var
 TCPClient: TIdTCPClient;
begin
 TCPClient := TIdTCPClient.Create(self);
 TCPClient.Connect("127.7.0.1", 3615);
 TCPClient.IOHandler.Write("Hello");
end;


...и нечего городить огород.


 
Anatoly Podgoretsky ©   (2010-05-15 22:10) [4]


> а почему ?

А вот из-за этого AOwner := TCPClient.Owner;


 
Zoom ©   (2010-05-15 22:37) [5]

Плохиш, а как тогда назначить уникальный creat() при создании ?

~AQUARIUS~ , спасибо, так получилось!

Харакири , еслиб так все просто... один статический компонент который заранее инициализирован... я хочу построить свой класс на основе TIdTCPClient прилепить к нему tthread в котором будет обращение к IdTCPClient
в принципе можно создать повторно IdTCPClient от TIdTCPClient и к нему присваивать уже проинициализированный объект... в общим я пока тренируюсь с ООП, и то что предложил  ~AQUARIUS~ , это то что мне надо!

procedure tnew.execute; // от tthread
begin
 repeat
 if TIdTCPClient(c).Connected then
 begin
    TIdTCPClient(c).IOHandler.CheckForDataOnSource(10);
   
   if TIdTCPClient(c).IOHandler.InputBuffer.Size > 0 then
   begin
     i := TIdTCPClient(c).IOHandler.InputBuffer.Size;
     s := TIdTCPClient(c).IOHandler.ReadString(i);
     onreceivestring(s);// on receive string
   end;
 end;
 until false;
end;


 
Харакири   (2010-05-15 23:01) [6]

>> один статический компонент который заранее инициализирован

И что мешает объявить поле для этого, кхм, компонента? В общем-то, когда ты кидаешь компонент на форму, Delphi сама делает это за тебя.

>> я хочу построить свой класс на основе TIdTCPClient прилепить к нему tthread в котором будет обращение к IdTCPClient

Компоненты в TThread? Не делай этого. VCL потоконезащищенная библиотека. Компоненты изначально не предназначены для работы в потоках. Будет у тебя большая беда с методами типа FindComponent().

P.S. Мне кажется, рановато ты за потоки взялся, если только еще изучаешь ООП и не всегда понимаешь, что пишешь и как это работает. Помнишь пословицу "Пуганая ворона куста боится"? Смотри, а то станут твои потоки этим самым кустом, и будешь от них шарахаться, как ошпаренный. Шел бы ты как-то поэтапно, системнее, что ли.


 
Zoom ©   (2010-05-15 23:32) [7]

Харакири , с потоками как раз все понятно запустил себе, он там своей жизнью и живет... вот что у меня получилось...
есть другая пословица - "Волков боятся, в лес не ходить" :)
почти все заработало , но действительно этот участок:

thread.c := FindComponent(name);
находит вместо компонента nil...

а как еще компонент может найти сам себя в процессе инициализации ???

/////////////////////////////////////////////////////////
unit Unit2;

interface

uses
 Classes, IdTCPClient, Dialogs;

type
 tnew = class(tthread)
 private
 protected
   procedure execute; override;
 //procedure onreceivestring(buf: string);
 public
   c: TComponent;
 end;

type
 tmyIdTCPClient = class(tIdTCPClient)
   constructor create(AOwner: TComponent);

 public
   thread: tnew;
 end;

implementation

constructor tmyIdTCPClient.create(AOwner: TComponent);
begin
 inherited create(AOwner);
 name := "n123";
 thread := tnew.Create(true);
 thread.c := FindComponent(name);
 thread.FreeOnTerminate := true;
 thread.priority := tplowest;
 thread.Resume;
end;

procedure tnew.execute;
var
 i: integer;
 s: string;
begin
 repeat
   if Assigned(c) then
     if TIdTCPClient(c).Connected then
     begin
       TIdTCPClient(c).IOHandler.CheckForDataOnSource(10);
       if TIdTCPClient(c).IOHandler.InputBuffer.Size > 0 then
       begin
         i := TIdTCPClient(c).IOHandler.InputBuffer.Size;
         s := TIdTCPClient(c).IOHandler.ReadString(i);
         ShowMessage(s);
     //  onreceivestring(s); // on receive string
       end;
     end;
 until false;
end;

end.


 
Плохиш ©   (2010-05-15 23:47) [8]


> thread.c := FindComponent(name);
> находит вместо компонента nil...

Не там ищешь.


> P.S. Мне кажется, рановато ты за потоки взялся, если только
> еще изучаешь ООП и не всегда понимаешь, что пишешь и как
> это работает.

В этой фразе первые два слова лишнии.


 
Zoom ©   (2010-05-15 23:56) [9]

Плохиш, как не там ?

сообщение с сервера в отдельном потоке читает нормально ...

если такой вариант работает:  
var
 TCPClient: tmyIdTCPClient;
begin
 TCPClient := tmyIdTCPClient.create(Self);
 TCPClient.thread.c := FindComponent(TCPClient.name);
 TCPClient.Connect("127.0.0.1", 3615);
 TCPClient.IOHandler.Write("Hello");


просто хочу  TCPClient.thread.c := FindComponent(TCPClient.name);
как-то вставить в конструктор... вот и все...


 
Плохиш ©   (2010-05-16 00:08) [10]


> Zoom ©   (15.05.10 23:56) [9]
>
> Плохиш, как не там ?

А вот так, пытаешься найти себя в своём же списке компонентов.


 
Zoom ©   (2010-05-16 00:25) [11]

>А вот так, пытаешься найти себя в своём же списке компонентов.
Плохиш , так это мне и надо !

thread.c := self; а вот так получилось! и даже нет необходимости в уникальном "name"

осталось прикрутить TNotifyEvent...

и разобраться с деструктором  - чтоб корректно останавливать дополнительный поток при выходе... почти все что я и хотел...


 
Плохиш ©   (2010-05-16 01:19) [12]


> Zoom ©   (15.05.10 23:32) [7]


> type
>  tmyIdTCPClient = class(tIdTCPClient)
>    constructor create(AOwner: TComponent);
>
>  public
>    thread: tnew;
>  end;
>

Бессмысленно ненужный и крайне вредный класс, ибо привязывается к какому-то предку, который может быть уничтожен во время работы трэда, что повлечёт за собой исключение, причину которого будет ой как трудно найти.

В конструкторе трэда создавай необходимый ему экземпляр TIdTCPClient.


 
Харакири   (2010-05-16 01:19) [13]

Насколько же надо быть глупым и насколько оптимистичными, чтобы писать столько много такого глючного и бесполезного кода?

Послушай, Зум! Остановись! Учи основы! Учи язык программирования! Ты такой бред тут несешь, просто страшно! Это не дилетантство, не быдлокодерство. Это хуже!

type
tmyIdTCPClient = class;

tnew = class(tthread)
private
protected
  procedure execute; override;
//procedure onreceivestring(buf: string);
public
  c: tmyIdTCPClient;
end;

// type
tmyIdTCPClient = class(tIdTCPClient)
  constructor create(AOwner: TComponent);

public
  thread: tnew;
end;


Хотя нет, ни к чему это. Потому что весь твой код - куча отстойной псевдопрограммистской ахинеи! Начиная с форматирования, и заканчивая непонимаением основ программирования, построениея VCL и прочего, прочего, прочего.

P.S. И у этого... кхм... не знаю, как его назвать... в анкете тоже прописано высшее образование! Аллес капут!


 
Zoom ©   (2010-05-16 01:24) [14]

Плохиш - иногда переученный хуже недоученного :)

несмотря на ваши замечания все работает как надо :)

еще раз спасибо ~AQUARIUS~, за то что наставил на путь истинный! респект!

unit Unit2;

interface

uses
 Classes, IdTCPClient, Dialogs;

type
 tnew = class(tthread)
 private
 protected
   procedure execute; override;
 //procedure onreceivestring(buf: string);
 public
   c: TComponent;
 end;

 TOnReceiveString = procedure(buf: string) of object;

 tmyIdTCPClient = class(tIdTCPClient)
   constructor create(AOwner: TComponent);
 protected
   FOnReceiveString: TOnReceiveString;
 public
   thread: tnew;
 published
   property OnReceiveString: TOnReceiveString read FOnReceiveString write FOnReceiveString;
 end;

implementation

constructor tmyIdTCPClient.create(AOwner: TComponent);
begin
 inherited create(AOwner);
//  name := "n123";
 thread := tnew.Create(true);
 thread.c := self; //  FindComponent(name);
 thread.FreeOnTerminate := true;
 thread.priority := tplowest;
 thread.Resume;
end;

procedure tnew.execute;
var
 i: integer;
 s: string;
begin
 repeat
   if Assigned(c) then
   try
     if TIdTCPClient(c).Connected then
     begin
       TIdTCPClient(c).IOHandler.CheckForDataOnSource(10);
       if TIdTCPClient(c).IOHandler.InputBuffer.Size > 0 then
       begin
         i := TIdTCPClient(c).IOHandler.InputBuffer.Size;
         s := TIdTCPClient(c).IOHandler.ReadString(i);
//          ShowMessage(s);
         tmyIdTCPClient(c).OnReceiveString(s);
       end;
     end;
   except
     exit; // а тут я еще подумаю как лучше выходить например "if halt then exit;"....
   end;
 until false;
end;

end.
///////////////////////////

procedure TForm1.Button1Click(Sender: TObject);
var
 TCPClient: tmyIdTCPClient;
begin
 TCPClient := tmyIdTCPClient.create(Self);
 TCPClient.OnReceiveString := OnReceiveString1;
 TCPClient.Connect("127.0.0.1", 3615);
 TCPClient.IOHandler.Write("Hello");
end;

procedure TForm1.OnReceiveString1(buf: string);
begin
memo1.Lines.Add(buf);
end;


 
Zoom ©   (2010-05-16 01:26) [15]

Удалено модератором


 
Харакири   (2010-05-16 01:27) [16]

Удалено модератором
Примечание: Даже если это он, эмоции надо сдерживать


 
Плохиш ©   (2010-05-16 01:28) [17]


> Zoom ©   (16.05.10 01:24) [14]
>
> Плохиш - иногда переученный хуже недоученного :)
>
> несмотря на ваши замечания все работает как надо :)

Ну, ну.


 
Германн ©   (2010-05-16 02:02) [18]


> Zoom ©   (16.05.10 01:24) [14]
>
> Плохиш - иногда переученный хуже недоученного :)
>
> несмотря на ваши замечания все работает как надо :)
>

Тебе просто не повезло. Это как в случаях с AV. Когда AV возникает на этапе отладки - это просто фантастическая удача!
Когда ошибка "выскочит" у пользователя, тогда и поймёшь.


 
Германн ©   (2010-05-16 02:09) [19]

Удалено модератором
Примечание: Правила читаем и уважаем


 
Zoom ©   (2010-05-16 02:26) [20]

а что академически верно определить наперед класс а потом походу дела изменить его ?  

и чем же обращение к компоненту через TComponent  - является быдлокодерством ??? или это просто ваше непонимание к такому подходу ?

нафига тогда вся Дельфи усеяна в (Sender: TObject) ?

может мне тогда книгу написать "Новые подходы к программированию в ООП" :)))


 
Германн ©   (2010-05-16 02:40) [21]


> Zoom ©   (16.05.10 02:26) [20]
>
> а что академически верно

Академически  верно сначала  изучить учебник. И хелп.


 
Германн ©   (2010-05-16 03:13) [22]


> может мне тогда книгу написать

Угу. "Дельфи  глазами неграмотного хакера".


 
_Юрий ©   (2010-05-16 11:27) [23]


> может мне тогда книгу написать "Новые подходы к программированию
> в ООП" :)))
>
>


Лучше напишешь потом книжку о том, как ты искал в этом коде косяки, которые было совершенно невозможно воспроизвести, но которые регулярно лезли.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.124 c
15-1263472383
xayam
2010-01-14 15:33
2010.08.27
DMSearch


2-1270734164
Pavel
2010-04-08 17:42
2010.08.27
Проблема с кодировкой


2-1271933283
rail
2010-04-22 14:48
2010.08.27
Запускной файл


15-1271077786
12
2010-04-12 17:09
2010.08.27
Зачем сия картинка? http://delphimaster.ru/i/1x1.gif


11-1217589019
rainstuff
2008-08-01 15:10
2010.08.27
Время и дата - некорректно отображение