Autor |
Beitrag |
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 26.07.17 20:15
Hallo!
Ich benutze eine TJvAppInstances-Komponente in meinem Programm und beobachte folgende unerwünschte Effekte:
Ich arbeite unter einem eingeschränkten Benutzerkonto und starte mehrere Instanzen meines Programms, wobei (a) das aktuelle, eingeschränkte Konto ist und (b) ein Administratorenkonto ist.
Wenn ich (a) und danach (b) starte, hängt (b), wenn ich dort versuche, auf JvAppInstances1.AppInstances.InstanceCount zuzugreifen, solange (a) noch läuft. Wenn (a) beendet wird, klappt es.
Wenn ich zuerst (b) und dann (a) starte, hängt (b) beim Aufruf von JvAppInstances1.AppInstances.InstanceCount und (a) öffnet sich erst gar nicht, wird aber im Taskmanager aufgelistet und öffnet sich erst, wenn (b) per Taskmanager abgeschossen wird.
JvAppInstances1.AppInstances.InstanceCount ist in jedem Fall zugewiesen ("Assigned").
Mehrere Instanzen unter verschiedenen Admin-Konten oder unter dem eingeschränkten Benutzerkonto verursachen keine Probleme.
Kann ich das im Programm irgendwie abfangen?
//Edit:
Es geht nicht ums Beenden per Taskmanager, es geht nur um JvAppInstances1.AppInstances.InstanceCount, das kommt im OnClose vor. Deaktiviere ich es dort, funktioniert alles wieder.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 26.07.17 21:01
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 27.07.17 17:46
Frühlingsrolle hat folgendes geschrieben : | Guten Abend galagher,
das hängt mit den Eigenschaften .Active und .AutoActive zusammen. Solange diese True sind, hängt sich die Anwendung auf. |
Jeweils nur eines auf False, dann beides auf False: Funktioniert leider nicht!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 27.07.17 18:23
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 27.07.17 18:52
Frühlingsrolle hat folgendes geschrieben : | Was willst du mit der Komponente erreichen? |
Ich möchte einfach in der Caption die Anzahl der Instanzen anzeigen, sonst nichts!
Kann man irgendwie abfangen, dass eine Instanz unter einem anderen Benutzerkonto gestartet wurde? Ich weiss, wie ich den Benutzernamen der jeweiligen Instanz ermittlen kann, ich brauche aber den Benutzernamen der aktuellen Windows-Sitzung. Wenn ich den erstmal habe und er sich von jenem Benutzernamen unterscheidet, mit dem ich die neue Instanz starten möchte (per Windows "Als Administrator ausführen"), komme ich schon weiter!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 27.07.17 19:31
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 27.07.17 21:10
Ich habe hier etwas gefunden: www.tek-tips.com/faqs.cfm?fid=7523
Funktioniert, die Instanzen werden auch unter mehreren Benutzerkonten korrekt gezählt. Nur das Aktualisieren ist ein bisschen unelegant, weil ich ja nicht so einfach Daten zwischen den Instanzen austauschen kann. (Habe zwar auch dafür eine Prozedur parat, muss ich aber nicht erst einbauen).
Ich weise einmalig beim Programmstart die Anzahl der Instanzen einer Variablen iInstance zu. In FormActivate und ApplicationEvents1Idle rufe ich ProcessCount auf. So habe ich stets aktuelle Werte. Wenn iInstance > InstanceCount(ExtractFileName(Application.ExeName)) ist, dekrementiere ich iInstance.
Muss noch testen, klappt aber bisher fehlerfrei!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 27.07.17 21:30
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 27.07.17 21:36
Frühlingsrolle hat folgendes geschrieben : | Such mal hier im Forum nach "Kommunikation zwischen 2 Formularen/Anwendungen". |
Mache ich am Samstag!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 29.07.17 09:22
Frühlingsrolle hat folgendes geschrieben : | "Kommunikation zwischen 2 Formularen/Anwendungen". |
Das läuft letzendlich alles auf FindWindow hinaus, dazu brauche ich die exakte Caption des Fensters. Diese ist aber jedesmal anders.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 29.07.17 10:43
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 29.07.17 11:12
Frühlingsrolle hat folgendes geschrieben : | Die Caption des Fensters kann man auch indirekt ermitteln: |
Das gibt mir die Caption des aufrufenden Fensters zurück, ich brauche aber alle Captions aller Fenster, die zB. den Text "SynEdit" enthalten. Dann schreibe ich die in eine TStringList und sende anhand dieser Liste an alle betreffenden Fenster eine Nachricht.
Aber zuerst brauche ich die Captions!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 29.07.17 15:19
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 01.08.17 19:56
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 01.08.17 20:31
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 03.08.17 18:04
Frühlingsrolle hat folgendes geschrieben : | Es könnte im Anschluss eine weitere Frage auftauchen, wie man nun im besagten Fenster auf ein bestimmtes Element/Control zugreift, wie z.B. ein TSynEdit, welches nachträglich ein paar Textteilen hinzugefügt bekommen soll. |
Ich mache das so:
Die sendende Form muss zunächst klarerweise senden können, dazu erstelle ich eine Liste mit den Fenster-Captions, an die ich senden will:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| sCaptionSubText := 'SynEdit '; procedure TForm1.MakeCaptionList(const iD: Integer); var i: Integer; List: TStringList; begin List := TStringList.Create; try GetSpecificWindowCaption(List, sCaptionSubText);
for i := 0 to List.Count-1 do SendText(Handle, iD, sCaptionSubText, List[i]); finally List.Free; end; end; |
Die empfangende Form bekommt eine Prozedur ReceiveData ( www.entwickler-ecke....hlight=cbdata+strlen):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| private procedure ReceiveData(var Msg: TWMCopyData); message WM_COPYDATA;
procedure TForm1.ReceiveData(var Msg: TWMCopyData); begin
if PChar(Msg.CopyDataStruct.lpData) = sCaptionSubText then begin if (Msg.CopyDataStruct.dwData = iCaptionUpdate) or (Msg.CopyDataStruct.dwData = iCaptionDecCount) then SetMainFormCaption(Msg.CopyDataStruct.dwData); end; end; |
Um auf Komponenten zuugreifen, kann man alles mögliche machen, zB Memo1.Lines.Add(PChar(Msg.CopyDataStruct.dwData)); - oder man könnte mit FindComponent arbeiten, was auch immer man möchte.
Im Wesentlichen kommt es nur auf Msg.CopyDataStruct.dwData an, denn das enthält den zu sendenden Text. Was das empfangende Fenster damit macht, steht in ReceiveData.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.08.17 06:54
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 04.08.17 18:13
Frühlingsrolle hat folgendes geschrieben : | Die etwas andere Möglichkeit wäre gewesen: |
Muss ich unbedingt testen, gefällt mir auch!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.08.17 14:06
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 07.08.17 20:57
Frühlingsrolle hat folgendes geschrieben : | Gut, nur mach es besser als ich., also mach eine procedure daraus und initialisiere die Liste bitte vor dem try. |
Ok, habe ich gemacht. Vor dem try, klar.
Mit TSynEdit kann ich das momentan nicht testen, da mein Programm "SynEdit" heisst. Also verwende ich zum Testen ein TMemo, da wird aber nur an das Memo des "eigenen" Fensters gesendet, und da auch nur an das zuletzt erstellte (Memo1 (nein), Memo2 (nein), Memo3 (ja)). Da kann ich gleich Memo3.Text := 'Neuer SynEdit Text' angeben!
Ich verwende eine Komponente, die ich von TJvWideHLEditor abgeleitet habe, und mit dieser oder dem Typnamen meiner Komponente - TWideHLEditorX - funktioniert es überhaupt nicht.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|