Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизМожно ли управлять классом через 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.068 c