Autor Beitrag
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Fr 21.02.03 12:58 
Hallöchen,

ich hab im SwissDelphiCenter folgenden QuellCode gefunden, und mir gedacht, ich kopier den bei mir einfach in eine neue App rein, benutze einfach bei mir die gleichen Bezeichner, und ab geht die Luzi.

Denkste! Das Prog strotz nämlich nur so vor Fehlermeldungen.... kann mir einer n Tipp geben, was ich zu beachten hab?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
(* 
  (Vorbemerkung zu "TNA": damit ist der "Task Notification Area" gemeint.) 

  Ein Symbol im TNA zu erzeugen -> kein Problem 
  Ein Popupmenu beim Klick auf dieses Symbol anzuzeigen -> kein Problem 
  AAABER dieses auch wieder verschwinden zu lassen wenn der Klick irgendwo anders 
  erfolgt -> eine Katastrophe ... jedenfalls bis mir die Idee kam ... siehe unten 
  die mit "ACHTUNG!!!" gekennzeichnete Zeile 
*)
 


unit TNA; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Controls, Forms, ExtCtrls, 
  ShellApi, Menus; 

const 
  k_WM_TASKMSG = WM_APP + 100;  //die "100" ist ein frei wählbarer Wert 

type 
  TForm1 = class(TForm) 
    TPopupMenu1: TPopupMenu; 
    procedure FormCreate(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure FormDblClick(Sender: TObject); 
    procedure PopupMenuClick(Sender: TObject); 
  private 
    { Private-Deklarationen } 
    tTNA: TNotifyIconData; 

    procedure WMTaskMsg(var Msg: TMessage); message k_WM_TASKMSG; 
    procedure AppActive; 
    procedure AppDeactivate; 
    procedure ShowIcon; 
    procedure ChangeIcon; 

  public 
    { Public-Deklarationen } 
  end

var 
  Form1: TForm1; 


implementation 


{$R *.DFM} 
{$R TNA.RES} //eine Resource mit 2 Icons oder Bitmaps 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
  {läßt die Form schon bei Programmstart verschwinden} 
  Application.ShowMainForm := False; 

  {Symbol im TNA anzeigen} 
  Self.ShowIcon; 
end


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
  {Symbol aus dem TNA entfernen} 
  Shell_NotifyIcon(NIM_DELETE, @tTNA); 
end


procedure TForm1.FormDblClick(Sender: TObject); 
begin 
  {lassen wir doch die Form wieder verschwinden ...} 
  Self.AppDeactivate; 

  {... und ändern das Symbol in dem TNA} 
  Self.ChangeIcon; 
end


procedure TForm1.PopupMenuClick(Sender: TObject); 
begin 
  case TPopupMenu(Sender).Tag of 

    {hier steht dann die Auswahl was getan werden soll} 
    {wenn auf das erschienene Popupmenü geklickt wurde} 
  end
end


procedure TForm1.WMTaskMsg(var Msg: TMessage); 
var 
  rCursor: TPoint; 
begin 
  {wenn die Nachricht aus unserem definierten Bereich kommt dann ...} 
  if Msg.wParam = tTNA.uID then 
  begin 
    {... tu was wenn das Ereignis ein ...} 
    case Msg.lParam of 

      {... rechter Mausklick ist oder ...} 
      WM_RBUTTONDOWN: 
        begin 
          {aktuelle Cursoposition holen} 
          GetCursorPos(rCursor); 

          {ACHTUNG!!!!! Der folgende Aufruf ist an dieser Stelle ganz wichtig!!!!} 
{Erst durch diese API-Funktion wird das Popupmenü dazu bewegt zu verschwinden 
wenn ein Klick außerhalb des Popupmenüs erfolgt}
 

          SetForegroundWindow(Self.Handle); 

          {Also, nicht vergessen!!!} 


          {Das Popupmenü erscheint an der gewünschten Position in dem TNA} 
          TPopupMenu1.Popup(rCursor.x, rCursor.y); 
        end

      {... ein linker doppelter Mausklick ist} 
      WM_LBUTTONDBLCLK: Self.AppActive; 
    end
  end
end


procedure TForm1.AppActive; 
var 
  hOwner: THandle; 
begin 
  {Form einblenden} 
  SendMessage(Self.Handle, WM_SYSCOMMAND, SC_RESTORE, 0); 
  ShowWindow(Self.Handle, SW_SHOW); 
  SetForegroundWindow(Self.Handle); 

  {Symbol in der Taskbar einblenden} 
  hOwner := GetWindow(Self.Handle, GW_OWNER); 
  SendMessage(hOwner, WM_SYSCOMMAND, SC_RESTORE, 0); 
  ShowWindow(hOwner, SW_SHOW); 
end


procedure TForm1.AppDeactivate; 
begin 
  {Form ausblenden} 
  ShowWindow(Self.Handle, SW_HIDE); 

  {Symbol in der Taskbar ausblenden} 
  ShowWindow(GetWindow(Self.Handle, GW_OWNER), SW_HIDE); 
end


procedure TForm1.ShowIcon; 
begin 
  tTNA.cbSize := SizeOf(tTNA); 
  tTNA.Wnd    := Self.Handle; 
  tTNA.uID    := 24112000;                     //frei wählbarer Wert zur Identifizierung 
  tTNA.uCallbackMessage := k_WM_TASKMSG; 
  tTNA.hIcon  := LoadIcon(hInstance, 'xxx'); 
  //xxx ist die Bezeichnung eines Icons aus "TNA.res" 
  StrCopy(tTNA.szTip, 'Hallo');             //Hint 
  tTNA.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; 
  {CB Symbol in dem TNA einrichten CE} 
  Shell_NotifyIcon(NIM_ADD, @tTNA); 
end


procedure TForm1.ChangeIcon; 
begin 
  tTNA.cbSize := SizeOf(tTNA); 
  tTNA.hIcon  := LoadIcon(hInstance, 'yyy'); 
  //yyy ist die Bezeichnung eines weiteren Icons aus "TNA.res" 
  StrCopy(tTNA.szTip, 'Welt');              //Hint 

  {CB Symbol im TNA ändern CE} 
  Shell_NotifyIcon(NIM_MODIFY, @tTNA); 
end


end.

mfg
kiwicht
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 13:11 
Ob du es glaubst oder nicht. Aber es wäre wesentlich hilfreicher, wenn du uns sagen würdest, was bei dir nicht geht, was für Fehlermeldungen kommen und wenn du uns mal deinen fehlerhaften Code zeigen würdest.

Einen Automechaniker nützt es auch sehr wenig, wenn du mit dem Auto deiner Frau in die Werkstatt kommst und denen sagst: "Das ist jetzt das Auto meiner Frau, aber an meinem geht die Lichtmaschine nicht mehr. Könnten sie sich das mal bitte ankucken?".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 13:23 
In meiner Eigenschaft als normaler Benutzer dieses Forums, der keinerlei Admin- oder Moderatorenrechte hat, würde ich dich bitten, solche Fragen künftig bitte in dem jeweiligen Forum zu stellen. Was soll´s bringen, wenn wir z.B. hier die Fehler aus anderen Foren ausmerzen. Davon haben die Mitglieder dort nicht viel.

Ich schlage also vor, du wendest dich an die Betreiber des SwissDelphiCenter und verweist auf die Fehler in dem Beitrag, zu denen ich dir hiermit die Lösungen anbiete:
ausblenden Quelltext
1:
procedure TForm1.ShowIcon(ID: Integer);					

ersetzen durch
ausblenden Quelltext
1:
procedure TForm1.ShowIcon;					

da die "ID" nicht gebraucht wird. Das gilt auch für den Eintrag im private-Teil der Form.

ausblenden Quelltext
1:
GetCursorPos(rCursor)					

Semikolon ergänzen!

ausblenden Quelltext
1:
TPopupMenu1.Popup(rCursor.x, rCursor.y);					

Kein echter Fehler! Beim Einfügen einer TPopupMenu-Komponente heißt diese allerdings standardmäßig nur "PopupMenu1". Falls dein Compiler hier meckert, dann nimm aus dem Quellcode das T am Anfang raus. Oder nenn deine Komponente entsprechend!

Zitat:
(Vorbemerkung zu "TNA": damit ist der "Task Notificytion Area" gemeint.)

Eigentlich heißt es Taskbar Notification Area, aber egal ... ´s ist ja ohnehin nur ein Kommentar im Quellcode. :wink:
kiwicht Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Fr 21.02.03 13:42 
asche auf mein haupt.

@Luckie:
Du hast natürlich recht, mein Fehler, weiß selber auch nicht warum ich mir diesmal die Fehlermeldungen ausgespart habe... :(

@MathiasSimmack
erstmal danke für die Hinweise. und auch du hast recht.

natürlich gehören fragen zu tutor´s und faq´s auf die dazugehörige seite. da ich aber in diesem forum ein sehr positive meinung von der kompetenz der mitglieder habe, und da meine fragen zu faq´s im swissdelphicenter so gut wie noch nie beantwortet wurden, dacht ich mir, frag ich halt hier mal nach.
Ich werd aber eure Kritik bezüglich meines PostingVerhaltens ernst nehmen, und versuchen solche FauxPas demnächst zu vermeiden... ;)
in jedem Fall vielen Dank für die Lösungsansätze, ich teste die mal aus, und dann sehn wa weiter..

mfg
kiwICht
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 19:00 
Zitat:
Ich werd aber eure Kritik bezüglich meines PostingVerhaltens ernst nehmen, ...

Es geht doch nicht um dein Postingverhalten. Das ist (denke ich) okay. Es geht nur um den Sinn. Stell dir vor, fehlerhafte Lösungen aus dem DF werden im SwissDelphiCenter oder in der Delphi-Praxis korrigiert. Das wüssten dann auch nur die Leute, die sowohl hier als auch dort aktiv sind. Alle anderen haben nichts davon und ärgern sich mit einer fehlerhaften oder einem unvollständigen Posting herum.

Notfalls setze dich mit dem Autoren des o.g. Quellcodes in Verbindung. Vielleicht ändert der sein Posting ja.
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Fr 21.02.03 19:46 
MathiasSimmack hat folgendes geschrieben:

Zitat:
(Vorbemerkung zu "TNA": damit ist der "Task Notificytion Area" gemeint.)

Eigentlich heißt es Taskbar Notification Area, aber egal ...


Das dachte ich auch schon. Dieser Versuch sich unter seinen Programmiererkollegen mit Fremdwörtern zu profilieren, ging wohl mächtig in die Hose. Ich habe jedenfalls geschmunzelt, schon mit mittelmäßigen Englischkenntnissen wäre dieser Fehler nicht passiert.
Also Mathias, go for it :wink: und zeig' ihm wo der Hammer hängt! :twisted:

Gruß,
Markus
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.02.03 20:26 
No, that's not my f.cking business. :wink:

Das soll kiwicht regeln. Ich bin kein Mitglied im SwissDelphiCenter. 3 Foren reichen ja auch.
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: Fr 21.02.03 20:29 
Zitat:
Das dachte ich auch schon. Dieser Versuch sich unter seinen Programmiererkollegen mit Fremdwörtern zu profilieren, ging wohl mächtig in die Hose.


War wohl nur ein Tippfehler. Sag ja auch nichts, wenn du ein Komma vergisst...*g*
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Sa 22.02.03 06:08 
MathiasSimmack hat folgendes geschrieben:

No, that's not my f.cking business. :wink:


Hehe, überredet! :wink:

MathiasSimmack hat folgendes geschrieben:

3 Foren reichen ja auch.


A propos 3 Foren, du hast mir immernoch nicht meine (Nachtrag-)Frage beantwortet (www.delphi-forum.de/viewtopic.php?t=6900) :wink:

Gruß,
Markus

PS: Was? Ich? Ein Komma vergessen? 8)
PPS: Deshalb gebe ich ja auch mit meinem Englisch an, dort brauchst Du nie ein Komma setzen und trotzdem ist alles richtig! :lol:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 22.02.03 09:42 
DaFox hat folgendes geschrieben:
A propos 3 Foren, du hast mir immernoch nicht meine (Nachtrag-)Frage beantwortet:

Zitat:
Nachtrag: @Mathias: EE? :wink:

Yo! - wenn du damit "experts-exchange" meinst (oder wie die heißen). Da bin ich zwar kein Mitglied, aber Google hilft weiter. :)
kiwicht Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mo 24.02.03 10:01 
bezüglich des TNA-Tippfehlers:
Ich möchte meinen, der Autor hat diesen Fehler ausgemerzt? Jedenfalls steht da jetzt, linguistisch so gut wie perfekt: Notification... soviel dazu.

Ich für meinen Teilen werde mich dann erstmal reuevoll an den Autor direkt wenden, bedanke mich aber trotzdem für eure Aufmerksamkeit.. :D

mfg idS
kiwicht