Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 26.07.17 21: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



BeitragVerfasst: Mi 26.07.17 22:01 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 27.07.17 18:46 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Do 27.07.17 19:23 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 27.07.17 19:52 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Do 27.07.17 20:31 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 27.07.17 22: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



BeitragVerfasst: Do 27.07.17 22:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 27.07.17 22:36 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 29.07.17 10:22 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
"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



BeitragVerfasst: Sa 29.07.17 11:43 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 29.07.17 12:12 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Sa 29.07.17 16:19 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 01.08.17 20:56 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
SubText ... Ein Wort, welches irgendwo in der Caption enthalten sein soll
Das ist perfekt! Darauf muss man aber auch erst kommen! Danke! :D

_________________
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



BeitragVerfasst: Di 01.08.17 21:31 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 03.08.17 19:04 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
sCaptionSubText := 'SynEdit ';  //Oder was man eben in der Caption sucht!
//...

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):
ausblenden 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;
//...

{----------------- ReceiveData - Text empfangen, Beispiel: --------------------}
procedure TForm1.ReceiveData(var Msg: TWMCopyData);
begin
(*//Optional kann der Identifier-Integer ausgewertet werden:
  if Msg.CopyDataStruct.dwData = 0 then [...] //Wenn 0 oder was auch immer, tu was!

  //Optional kann der Integerwert der Stringlänge ausgewertet werden:
  if Msg.CopyDataStruct.cbData = [...] //tu was!
*)


  {Nun den gesendeten Text verarbeiten:}
  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



BeitragVerfasst: Fr 04.08.17 07:54 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 04.08.17 19:13 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Sa 05.08.17 15:06 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2430
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 07.08.17 21:57 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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. :gruebel: :nixweiss:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!