Autor Beitrag
biohazard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Di 25.03.03 14:49 
Hier mein Problem:

Ich habe 2 Programm. Das 1. Programm ist irgendein Programm das auf eine Datenbank (vorerst auf Paradox Tabellen) zugreift. Dieses Programm ist fest und es kann nichts geändert werden.

Das 2. Prog ist das was ich gerade erstelle. Wenn ich nun im 1. Prog einen Datensatz markiere (z.B. in einen DbGrid) und dann das 2. Prog starte/aktiviere, dann möchte ich, daß der markierte Datensatz in diesem 2.Prog aufgerufen/angezeigt wird.

Hab mir gedacht, daß man auf so eine Art Datensatzzeiger in der Tabelle zugreift. Hab aber bis jetzt noch nichts gefunden. Oder muß ich erst auf das andere Programm zugreifen.

Hilfe!!!!!!!
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Di 25.03.03 19:59 
Das wird so einfach nicht gehen, da beide Programme in getrennten Speicherbereichen laufen und die eine von der anderen nicht ohne viel API KnowHow wissen darf. Wenn die Tabelle bekannt sind, kannst du die nicht mit einem neuen Proggi bearbeiten?
grez
msch
biohazard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Mi 26.03.03 10:05 
Das hab ich befürchtet. Die Tabellen sind bekannt, sollen aber später von Nutzer zu Nutzer frei auswählbar sein.

Wenn die Tabelle im Hintergrund des 1. Programmes läuft, muß man doch irgendwie herausbekommen können wo der Zeiger gerade liegt.

Das mit einem neuen Prog wäre nicht so günstig für mich aber wenn es sich nicht anders lösen läßt muß ich es halt so machen.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 26.03.03 10:19 
Bei Interbase geht es nicht direkt, da Interbase die Multigenerationen-Architektur besitzt, d.h. jede Transaktion bekommt ihr eigenes Abbild der Datenbank. Du kannst höchstens in einer weiterenTabelle oder Spalte ein Zeichen setzen. Musste halt noch die Transaktionseigenschaften beider Transaktionen richtig setzen, damit beide diese Änderungen vom anderen mitbekommen.
Gruß
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Mi 26.03.03 10:26 
du könntest das ganze per Message erledigen, ich hab da mal was mit
PostThreadMessage gemacht, da muss man, da ein Thread keine WndProc besitzt sich selbst darum kümmern per peekmessage oder getmessage

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
PostThreadMessage(handle{nicht wirklich wichtig},MSGID{wichtig | WM_USER+X},0,integer(zeiger));

//im thread hab ich dann

procedure myThr.ThrInternalGetMessage;
var msg:TMsg;
 begin
  if PeekMessage(msg,0,WMUSER+X-1,WM_USER+X+1,PM_REMOVE) then
    case msg.message of
     WM_USER+X : doWhatYouWannaDo;
    end;
end;


eine denkbare aber nicht unbedingt ideale Lösung, aber dennoch übertragber.

zur Erleuterung: du sendest eine Message (wohin ist irrelevant) mit einer dir bekannten id (MsgID), in deinem anderen Programm muesstes du halt zyklisch prüfen per PeekMessage ob eine mit dieser msgid vorliegt.
WMUSER+X = deine gesetzte msgid
WMUSER+X-1 = in der Peek untergrenze
WMUSER+X+1 = obergrenze
die Breichspanne zwischen ober- und untergrenze ist dir überlassen,
der letzte Param (REMOVE) bedeutet das die Nachricht nach dem Abholen gelöscht werden soll (aus der MessageWarteSchlange)

integer(zeiger) wandelt denn zeiger in einen postbaren int wert
int der peek kannst du das ganze invertieren per bsp.: Pointer(msg.Lparam) wieder in einen Zeiger umwandeln

_________________
mfg
Tana´Ri
biohazard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Mi 26.03.03 13:24 
an Tana´Ri

Das mit den Threat und Message das du mir da beschrieben hast ist für mich noch Neuland. Ich komm da nicht so richtig raus.

Von wo sende ich die Message überhaupt. Wenn dann kann ich das Senden und Abfragen ja nur in einem (meinem) Prog machen, da ich auf das andere kein Einfluß habe.

Vieleicht hab ich dich auch nur falsch verstanden.

Ich versuch erst mal herauszubekommen was das mit den Threats und dem ganzen Drumherum auf sich hat.
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Mi 26.03.03 14:58 
also ich hab das bisher auch nur einmal gemacht,

da deine Programme unabhängig von einander, daher muessen sie per windows messages miteinander kummunizieren.

das postmessage(...) kennst du ?

empfehlenswert ist hier auch in beiden Programmen, hab gerade gelesen, dir eine eindeutige MessageID zu erstellen, diese bekommst du indem du per
code bsp: myMsgID := RegisterWindowMessage(pchar('STRING'));
dies musst du in beiden Programmen so machen, der STRING muss identisch sein sodas das Result von RegisterWindowMessage auch identisch ist.

post wenn datensatz makiert:
Nun kannst du per PostMessage deine Nachricht verschicken, welche dann von dem 2 Programm abegholt werden muss, d.h. du sendest diese message, diese liegt dann in der internen windowsmessagewarteschlange. Über die Funktionen GetMessage und Peekmessage kann du die Warteschlange abfragen ob diese Message vorhanden ist.

Datensatz anzeige:
du willst so zusagen den Inhalt in deinem zweiten Programm nochmals darstellen bzw. anzeigen.
du könntest ein Record erstellen in dem die gewünschten infos stehen und ein zeiger auf dieses senden. das record könntest du bei jeder änderung des aktuell markierten datensatzes neu besetzten ... oder einen String erstellen mit den Infos, und einen zeiger auf den String versenden oder die
ein ander logik dazu nutzen, dies ist wohl von dir abhängig.

eins sei noch angemerkt ich hab das in dieser form noch nicht gemacht und denke mir diese möglichkeit, bin mir aber von der tauglichkeit schon überzeugt :)

viel glüch

_________________
mfg
Tana´Ri
biohazard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Do 10.04.03 18:06 
So!!! Hab mal ein wenig postmessage usw. ausgetestet. Hab das von Tana´Ri zwar nicht so hinbekommen, aber es hat mich schon mal in die Richtung geleitet in die ich will.

Erst mal Danke bis dahin!

Bin jetzt so weit gekommen, daß ich mir die Handle von den Windows und deren Komponenten hole. Da könnte ich ja dann die Infos mit postmessage und dem Handle verschicken.

Problem: Ich habe jetzt zwar das Handle, aber wie greife ich jetzt zu. Auf einen Button z.B. kann man ja leicht zugreifen aber wie funzt das mit Datenbankkomponenten wie DBGrid. Hab mich schon mal in der MSDN umgesehen, aber nichts gefunden.