Entwickler-Ecke
Windows API - Die richtige Rich-Edit-Komponente aktivieren...?
Jebaz - Fr 29.11.02 10:17
Titel: Die richtige Rich-Edit-Komponente aktivieren...?
Hallo zusammnen,
ich bin gerade an einem Chat. Nun habe ich die möglichkeit von Private-Chats eingebaut, was auch einwandfrei funktioniert. Nur, die Private-Chat-Fenster erstelle ich natürlich als Instanzen....nun hab ich auch schon einprogrammiert, dass immer das richtige Fenster aktiviert wird, wenn jemand was sagt...nur, der Text wird immer in den zuletzt erstellten Rich-Edit eingefügt, was bruch ist...er beachtet gar nicht, welches Fenster aktiv ist... Naja, bei einer MDIChild-Anwengung wüsste ich, wie ich mit einer Funtkion das aktive Fenster zurückbekomme, nur halt, will und kann ich keine MDI-App draus machen....please, es muss doch einen einfachen weg gebe, wie ich im aktive Fenster auf die Richedit zugreifen kann...oder?
Andreas Pfau - Mo 02.12.02 17:42
Ich würde es so machen: Da aktive Fenster mit GetActivewindow() ausfindig machen, und eine Message (z.B. Wm_User + 1) hinschicken, mit der Adresse eines PChar als Parameter. Dein Fenster kann darauf reagieren und den PChar in's RichEdit einfügen.
Oder du arbeitest mit DDE, das ist zwar komplizierter, aber wenn du VCL verwendest, kein großes problem (TDdeClientconv und TDdeServerConv).
Oder du schreibst die Daten in einen Temporären Registry-Schlüssel. Das aktive window liest den schlüssel in festen Intervallen und löscht ihn dann.
Ich würde allerdings bei SendMessage() bleiben...
Jebaz - Mo 02.12.02 18:35
Titel: Thanks a lot :-)
Hei jow, danke für deine Mühe, find ich echt interessant, deinen Ansatz. Nur das Problem, ich schnall das Prinzip der SendMessages noch nicht ganz, was dazu führt, dass ich nicht nachfollziehen kann, wie ich das genau so lösen soll. Aber das ist überhaupt nicht schlimm :lol:
Denn: Ich hatte zwei Stunden nachdem ich gepostet hatte die Lösung! Ich hab angefangen mit den Sendern herumzuspielen...und wow, ich bin beindruckt, was man für eine Macht besitzt, mit diesen Dingern. Ich merk mir nun beim erstellen eines Fenster dessen Componenten-ID die es auf Form1 bezogen hat in einer Liste. Dann, wenn ich auf die richtige Rich-Edit Komponente zugreifen möchte, geh ich in diese Liste mir di CompID holen (Diese weiss ich, weil ich gleichzeitig eine Liste mit den Fenster-Titeln führe...die ID's der beiden Listen sind gleich, und den Fenster Titel des aktiven Fensters weiss ich auch) und habe eine eigene Funktion erstellt die etwa so aussieht:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm2.FillIn(Sender: TObject; Request: String); begin with Sender as TForm2 do begin RichEdit1.Lines.Add(Request); end; end; |
Und der Aufruf der Prozedur sieht etwa so aus:
Quelltext
1:
| Form2.FillIn(Form1.Components[IntToStr(Form1.lbCompID.Items.Strings[i])] |
Vorhin muss man noch den Wert von i bestimmen...
Quelltext
1:
| i := Form1.lbWindowTitles.Items.IndexOf('ActiveWindowTitle'); |
soodeli, und soweit funktioniert alles einwandfrei, denn was ich auch mal gelesen hab, Fenster die man als Instanz erstellt werden, nummeriert Windows durch (obwohl man nirgens was davon sieht). Das kann man nur aufrufen mit einem Aufruf der etwa so aussieht:
Quelltext
1:
| ShowMessage((Sender as TForm2).Owner); |
Dieser Aufruf muss natürlich im zweiten Fenster irgendwo bei einem Event eingefügt werden, also auf dem Fenster, welches als Instanz geöffnet wird.
So, das wärs, wass ich soweit über die Sender rausgefunden hab...ich brauch dieses Problemlösungsverfahren inzwischen in meinem gesamten Chat 8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!