Autor Beitrag
rey003
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 22:34 
Hallo Leute,
ich habe mal eine kleine Frage zu der Case-Anweisung! :(
Ich habe eine Procedure, der ein Handle übergeben wird! In dieser Procedure soll jetzt unterschieden werden von welcher Komponente die Procedure aufgerufen wird! Nun dachte ich, ich mach das gleich mit einer Case-Anweisung, in der das übergebe Handle mit Werten aus einem Array verglichen wird!
Das klappt aber anscheind nicht, da man mit case nur Konstanten vergleichen kann!
Hier erstmal der Quelltext!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 HButtons: array [0..10] of HWND;

...

procedure ButtonOnClick(Sender: HWND);
begin
 case Sender of
  HButtons[1]: messagebeep(1);
  HButtons[2]: messagebeep(1); 
 end;
end;


Gibt es eine andere Möglichkeit als alles mit If zu vergleichen? :?
Die Frage klingt bestimmt dumm und ist ganz einfach, aber irgendwie habe ich grade ein Black-out! :shock:
Ach das ist für NonVCL, deshalb wird als Sender ein Handle übergeben! :wink:

_________________
Daniel S.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 30.12.06 23:20 
probier es doch mal mit for

bspw.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 HButtons: array [0..99999910] of HWND;

...

procedure ButtonOnClick(Sender: HWND);
var
 i: integer;
begin
 for i := o to high(hbuttons) do
  if hbuttons[i] = sender then messagebeep(1);
end;


<HTH>
rey003 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 23:29 
Zunächst: Danke für deine Antwort! :D
Bis jetzt hab ich es, wie du es auch vorgeschlagen hast, mit einer For-Schleife gelöst, weil ich auf die ganzen If-Schleifen keine Lust hatte! :mrgreen:
Aber ich glaube das es nicht grade der beste Programmierstil ist! Aber anscheinend geht es in dem Fall wirklich nicht anders! :wink:

_________________
Daniel S.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 30.12.06 23:35 
dafür brauchst doch keine paar hundert if-schleifen. wenn du das kompakt machen möchtest, lager das in eine eigene funtion aus.. bpsw. so...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
 HButtons: array [0..99999910] of HWND;

...
funcktion check(sender: hwnd): 
var
 i: integer;
begin
 for i := o to high(hbuttons) do
  if hbuttons[i] = sender then 
  begin
   result := i; //irgendeine (un)vernünftige rückgabe
   break;
  end;
end;

procedure ButtonOnClick(Sender: HWND);
begin
 messagebeep(check(sender)); //irgendwas machen
end;
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Sa 30.12.06 23:38 
Stimmt, Case geht nur bei konstanten Werten.
Auszug aus der Delphi-Hilfe in Bezug auf den Selektorausdruck:
ausblenden Quelltext
1:
2:
3:
Eine Zahl, eine deklarierte Konstante oder ein anderer Ausdruck,
 den der Compiler auswerten kann, ohne dazu das Programm selbst 
auszuführen.


Handles sind bekanntlicherweise nicht vorher bekannt.
rey003 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 23:48 
In der Hilfe hab ich gar nicht mehr nachgelesen! Oh man ich Dussel! :oops:
Naja bis jetzt sieht die eigentliche Funktion so aus:
(aber trotzdem danke für deine Bemühungen)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure KButtonClick(Sender : HWND);
var
 i : integer;
begin
  for i := 0 to 10 do
   begin
     if HKButtons[i] = Sender then
      begin
        SendMessage(HKButtons[i],WM_DSIMAGESETICON ,hIcon_Clicked,0);
        InvalidateRect(HKButtons[i],nil,true);
      end;
   end;
end;

Da diese Procedure eben für viele verschieden Komponeten gilt, und jede etwas anders machen sollte, wenn die angeklickt wird, wollte ich es so unterscheiden!
Aber ich bekomm das schon hin! :wink:
Wollte nur wissen ob das mit case wirklich nicht geht!
Ich mach den Thema mal als beantwortet :wink:

//Edit: Danke noch mal an euch beide! Und einen guten Rutsch ins Jahr 2007! :)

_________________
Daniel S.