![]() |
Keine Aktivierung der Form bei Aufruf über Tastenkombination
Hi,
ich habe eine Applikation in Delphi programmiert, welche man über eine simple Tastenkombination aufrufen soll. Der Benutzer soll von einer anderen Anwendung Zeilen in die Zwischenablage kopieren und dann nur noch über die Tastenkombination meine Applikation aufrufen. Beim Aufruf wird in ein Memofeld das kopierte eingefügt und bearbeitet... Beim ersten Aufruf tut es schon, aber wenn der Benutzer mehrere Zeilen bearbeiten soll, soll die Applikation mehrmals über die Tastenkombination aufgerufen ohne jedes mal beendet zu werden, aber das Memofeld wird nicht aktualisiert, so wie es sein müsste. Aber wenn man die Anwendung ganz normal anklickt dann schon... Das ganze mache ich mit Windows-Botschaftbehandlung: mit SendMessage, also falls die Anwendung noch mal aufgerufen werden soll, sollen die Memofelder geleert und mit den aktuellen Daten der Zwischenablage gefüllt werden. Wie gesagt über Mausklick klappt das hervorragend, aber nicht über einen Aufruf mit Tastenkombination :wall: Könnte mir vielleicht jemand sagen, woran das liegt? Liegt es an meinem Windows98? |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo.
Ich stelle mir die Frage, über welche API-Funktionen du versuchst Deine Delphi-Application zu aktivieren. Verwendest Du nur SendMessage() oder auch BringToFront und oder SetFocus usw... Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Ich mache das mit SendMessage, welche ich in die Initalisierung vom Mutex eingebaut habe...
Es klappt ja eingentlich auch aber dafür muss man die Anwendung auf dem Desktop anklicken. Es ist die blöde Tastenkombination : STRG + ALT + T |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Privates bitte via PN - hat im Thread nun echt nichts verloren :warn:
...:cat:... P.S.: Ich flirte auch gerne, aber :mrgreen: |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Nein ich hab das Problem noch nicht gelöst, habe auch kaum Zeit dafür :(
Du hast mir garnicht geschrieben woher du kommst, brauch ein wenig Input, damit ich entscheide, ob ich mit dir Kaffee trinken gehe :roll: |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Ups tschuldigung, war keine Absicht :oops:
|
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo pistazie.
Abgesehen von Deiner Flirtaffäre versuche ich eine Lösung zu finden. Wie wäre es, wenn Du deine Application hierdran hängst, damit wir es uns mal angucken können und uns eine besser Vorstellung zur Application machen können. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Liste der Anhänge anzeigen (Anzahl: 1)
Danke das ist lieb von dir :)
Weiß garnicht ob man die ganze Unit hier anhängen kann, ich probiers einfach :gruebel: |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
ich glaube so ist es besser:
Delphi-Quellcode:
[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
//Nachricht mit Keycode 0 wird von Anwendung empfangen://
procedure TForm1.WMTimeChange(var Message: TMessage); var Result, Gesamthex, Hexawert, Hinten, Vorne, Ausgabe : String; begin if Chr(Message.WParam) = #0 then begin MemoEingabe.Text := ''; MemoAusgabe.Text := ''; Formfuellen(Result,Gesamthex,Hexawert,Vorne,Hinten,Ausgabe); end else inherited; end; //############################################################################## //Stand: 17.10.2003 //Autor: //Beschr:Wandelt den Hexadezimalen Wert in den entsprechenden dezimalen Ascii-Code und // diesen in das entsprechende Ascii-Zeichen //Version: 1.1 //Global: - //Input: Gesamthex,Hexawert //Output: //Result: //Exception: function TForm1.HexToAsciiToZeichen(Gesamthex,Hexawert : String) : String; var Asciicode, Gesamtwort : String; AsciiInt,PosLeer, PosD, PosA : Integer; Buchstabe : String; begin Gesamthex := MemoEingabe.Text; Gesamtwort := ''; repeat PosLeer := Pos(' ', Gesamthex); if (PosLeer > 0) then begin Delete(Gesamthex,PosLeer,1); end; PosD := Pos(#$D, Gesamthex); if (PosD > 0) then begin Delete(Gesamthex,PosD,1); end; PosA := Pos(#$A, Gesamthex); if (PosA > 0) then begin Delete(Gesamthex,PosA,1); end; until (PosLeer = 0); repeat //Aus dem gesamten String(Gesamthex) sollen in 2er-Zeichen(Hexawert) Teilstrings extrahiert werden: Hexawert := Copy(Gesamthex, 1, 2); if copy(Hexawert,2,2) <> '' then begin //Umwandeln Hexadez zu Asciicode(Dez): Asciicode := IntToStr(StrToInt('$' + Hexawert)); AsciiInt := StrToInt(Asciicode); if (AsciiInt >= 32) then begin //Umwandeln Asciicode zu Asciizeichen: Buchstabe := Chr(AsciiInt); end else begin Buchstabe := ' '; end; Gesamtwort := Gesamtwort + Buchstabe; Delete(Gesamthex, 1, 2); Result := Gesamtwort; end until (Gesamthex = ''); end; //Form mit Inhalt:// procedure TForm1.Formfuellen(Result,Gesamthex,Hexawert,Vorne,Hinten : String; var Ausgabe : String); var Stringlaenge,PosSeparator : Integer; begin MemoEingabe.PasteFromClipboard; Result := HexToAsciiToZeichen(Gesamthex,Hexawert); Stringlaenge := Length(Result); repeat PosSeparator := Pos('/', Result); if (PosSeparator > 0) then begin Vorne := copy(Result,1,PosSeparator-1); Hinten := copy(Result,PosSeparator+1,Stringlaenge); Delete(Result, PosSeparator,1); Result := Hinten; Ausgabe := Vorne + #13#10 + Hinten; Result := Ausgabe; end; until (PosSeparator = 0); MemoAusgabe.Text := Result; end; //Gesamtablauf:// procedure TForm1.FormActivate(Sender: TObject); var Result, Gesamthex, Hexawert, Hinten, Vorne, Ausgabe : String; begin MemoEingabe.Text := ''; MemoAusgabe.Text := ''; Formfuellen(Result,Gesamthex,Hexawert,Vorne,Hinten,Ausgabe); // ShowMessage('Hallo'); end; //Mehrfachstart verhindern:// var mHandle: THandle; ustrProgName : String; Initialization begin //ShowMessage(Application.ExeName); ustrProgName := 'Terminal.exe' + #0; //ustrProgName := Application.ExeName + #0; mHandle := CreateMutex(nil,True,@ustrProgName[1]); if GetLastError = ERROR_ALREADY_EXISTS then begin //Nachricht versenden Keycode 0: SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0); //Anwendung läuft bereits: //showMessage('Anwendung läuft bereits!'); //Beendet Anwendung: Halt; end; end; Finalization begin if mHandle <> 0 then CloseHandle(mHandle); end; end. |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo,
So ich habs füge mal folgenden Code in deine Unit ein. Typ für Hotkey:
Delphi-Quellcode:
Constante für den Key (zum aktivieren deiner Application);
type
TWMHotkey = record Msg: Cardinal; idHotKey: Word; Modifiers: Integer; VirtKey: Integer; end;
Delphi-Quellcode:
Tastenkürzel registrieren für diese Anwendung:
const
ID = $FF;
Delphi-Quellcode:
Neue Private procedure zum Bearbeiten des Shortcuts;
procedure FormCreate(Sender: TObject);
Delphi-Quellcode:
Implementierung von FormCreate(...) und WMHotKey(...)
procedure WMHotKey(var Msg: TWMHotKey); Message WM_HOTKEY;
Delphi-Quellcode:
In diesem Fall habe ich jetzt einen ganz komischen HotKey ausprobiert. Ich denke das Du bestimmt einen einfacheren findest.
procedure TForm1.FormCreate(Sender: TObject);
var bolOK: longbool; begin bolOK:=RegisterHotKey(self.Handle, ID, MOD_Alt+MOD_CONTROL+MOD_SHIFT, vk_escape);//Ord('Q') end; procedure TForm1.WMHotKey(Var Msg: TWMHotkey); begin case Msg.IdHotKey of ID: begin Application.BringToFront; Windows.SetFocus(self.Handle); end; ID+1: caption:='es ist immer noch alles klar'; // Abhängig von der ID wird entschieden, was getan werden soll. end; inherited; end; Dein Code müsste ungefähr so aussehen:
Delphi-Quellcode:
Gruss
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TWMHotkey = record Msg: Cardinal; idHotKey: Word; Modifiers: Integer; VirtKey: Integer; end; const ID = $FF; type TForm1 = class(TForm) GroupBox3: TGroupBox; Memo1: TMemo; BitBtn2: TBitBtn; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure WMHotKey(var Msg: TWMHotKey); Message WM_HOTKEY; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var bolOK: longbool; begin bolOK:=RegisterHotKey(self.Handle, ID, MOD_Alt+MOD_CONTROL+MOD_SHIFT, vk_escape);//Ord('Q') end; procedure TForm1.WMHotKey(Var Msg: TWMHotkey); begin case Msg.IdHotKey of ID: begin Application.BringToFront; Windows.SetFocus(self.Handle); end; ID+1: caption:='es ist immer noch alles klar'; // Abhängig von der ID wird entschieden, was getan werden soll. end; inherited; end; end. Samson. |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Also ich hab das ganze mal jetzt eingefügt zu meiner Unit...
Die Anwendung erscheint zwar jetzt bei der Tastenkombination in den Vordergrund aber wenn ich mehrere Sachen hintereinander einfügen möchte, tut sich garnix, außer dass die Anwenung in den Vordergrung kommt... Es wird das aktuelle aus der Zwischenablage nicht eingelesen wenn ich hintereinander kopiere und die Anwendung aufrufe (STR+ALT+T)... Außerdem bringt der Compiler die Meldung: [Hinweis] Unit1.pas(65): Auf 'bolOK' zugewiesener Wert wird niemals benutzt Nun ja ich bin langsam am Verzweifeln :cry: aber ich bin dir dennoch sehr dankbar für deine Bemühungen |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo,
ich hatte mich jetzt nur damit beschäftigt, das Programm in den Vordergrund zu stellen und es entsprechend zu aktivieren. Wenn Du den Inhalt der Zwischenablage in dem Memo haben willst musst Du noch folgendes Implementieren:
Delphi-Quellcode:
Die Warnmeldung hat nix zu sagen. Du kannst das bolOK auch entsprechend aus dem Code entfernen. Es ist sinnvoll, wenn Du noch weitere Verarbeitungen durchführen möchtest.
procedure TForm1.GetClipboard;
var clip:TClipboard; begin clip := TClipboard.Create; try self.Memo1.Text := clip.AsText; finally clip.Free; end; end; In diesem Fall könnte bolOK = false sein, wenn der Key nicht Registriert wurde. Du kannst z. b. beim Programmstart eine entsprechende Meldung auf dem Bildschirm anzeigen. Gruss Samson end; |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo Samson,
habe diese Prozedur noch eingefügt in mein Programm, aber der Compiler kann mit GetClipborad nix anfangen: [Fehler] Unit1.pas(64): Undefinierter Bezeichner: 'TClipboard' Hab ich das falsch reingesetzt? :oops: |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo,
Sorry ich vergass, daß Du die Unit: Clipbrd noch einfügen musst. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hab ich gemacht, kommt zwar keine Fehlermeldung mehr, aber es hat sich trotzdem nix geändert, wird trotzdem nix eingefügt :(
|
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo,
von wo rufst Du die procedure denn auf??? Im FormActivate oder in welchem Ereigniss? Die Clipboard-procedure die ich geschrieben habe, ist ja nur eine Procedure und muss ja auch irgendwo aufgerufen werden. Wir haben doch zuvor noch den Shortcut mit einer case-Anweisung eingefügt, in der das Form im Vordergrund und Focussiert wird. Füge da doch den Aufgruf dieser Clipboard-Funktion ein. Dann sollte folgendes gehen: - Aufruf des Programms über einen Shortcut - Zwischenablage in dem Memo einfügen. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
ich hab die Prozedur in in die procedure.FormFuellen eingebaut, anstelle vom MemoEingabe.PasteFromClipboard. FormFuellen rufe ich einmal im WMTimeChange auf und dann noch im TForm1.FormActive...
Diese procedure TForm1.GetClipboard hat gar keine Übergabeparameter, kann sowas funktionieren? |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo Frank,
das kanns nicht sein. Du bist hier in einem Delphi-Forum gelandet und nicht in einem Kontaktform. Es stört ungemein, wenn man son misst zwischen dem Sachlichen unterscheiden muss. Halte bitte diese anmachen für andere Foren zurück. Wenn pestazie mit Dir Kontakt haben möchte wird Sie Dich anschreiben oder sonst irgendwie in Kontakt treten. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo.
FormActivate wird nur beim Start des Programms einmal ausgeführt. Hast Du mal nen Breakpoint auf die Funktion: FormFuellen gesetzt. Werden denn alle Befehle in der Function ausgeführt??? Teste das doch mal. GetClipboard brauch keine Parameter. Warum denn auch? Ich erzeuge eine Instanz von der Zwischenablage und fülle das Object von Deiner Form. Wenn DU eine allgemeine procedure: GetClipboard schreiben würdest, könntest du das Memo übergeben, aber ich denke das das hier keinen Sinn macht. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
@fletscher und pistazie
das sich weder der eine, noch die andere zurückhalten kann mit dem Flirt-lödsinn, das in diesem Thread absolut nichts zutun hat, habe ich alle überflüssigen Beiträge gelöscht! Ich hoffe das jetzt endlich schluss ist, beide haben eine EMail-Addy im Profil hinterlassen, beide können die PN-Funktion nutzen. Wenn das kein Ende hat, werde ich den Thread ohne weitere Vorwarnung schliessen und bedanken könnt Ihr Euch dann alle bei fletscher. :warn: |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hi Samson,
das hatte ich schon mal gemacht aber ich habe wieder einen Breakpoint auf Formfuellen gesetzt. Es werden in der Tat alle Befehle ausgeführt... Ich habe den Aufruf GetClipboard auch in die Case-Anweisung eingebaut, keine Fehlermeldung. Die Tastenkombination reagiert trotzdem nicht :wall: Und nun? |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo pestazie.
Ich pople nochmal in die Nase und mal gucken was raus kommt. Ich melde mich gleich wieder. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe Dir mal ein Programm erstellt. Folgende aufgaben werden gelöst: - Aktivierung der Anwendung mit: [STRG]+[ALT]+[F12] - Holt sich Text aus der Zwischenablage und fügt diesen in das Memo ein. - Mit der Checkbox kann entschieden werden, ob ich den Text anhängen möchte oder nur diesen im Memo haben möchte. Ich hoffe das das endlich weiterhilft. Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo pistazie.
wurde das Problem eigentlich noch gelöst?? Gruss Samson |
Re: Keine Aktivierung der Form bei Aufruf über Tastenkombina
Hallo Samson,
ne du das konnte ich nicht mehr lösen, alle Lösungsvorschläge von dir haben bei mir irgendwie nicht so funktioniert... :gruebel: Mein Abtleiter und ich haben uns deswegen überlegt dass die Anwendung nicht mit der Tastenmkombination sondern ganz normal mit Doppelklick mehrfach gestartet werden kann. Dann tuts nämlich schon das was es mit der Tastenkombination tun soll... Aber trotzdem vielen dank nochmal für deine Bemühungen :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz