![]() |
Overload bei Funktion, beide Parameter sind Ganzzahl
Hallo an alle,
ich schreibe mir grad eine Klasse zusammen in der ich laufende Programme "verwalten" will. Nun hab ich das so aufgebaut das man, wenn man zum Beispiel ein Programm aus der Liste entfernen will, entweder das Handle oder den Index in der Liste übergibt.
Delphi-Quellcode:
Ich hätte das aber lieber mittels Override für den anwendenden Entwickler allgemeiner gestaltet
function DeleteProgramByHandle(Handle: Longword): Boolean;
function DeleteProgramByIndex(Index: Integer): Boolean; wie zum Beispiel:
Delphi-Quellcode:
Das ich einfach nur .DeleteProgram aufrufen muss, da aber beide Parameter Ganzzahlen sind denke ich
function DeleteProgram(Handle: Longword): Boolean; Override;
function DeleteProgram(Index: Integer): Boolean; Override; nicht das das klappt oder? <Edit> Vor allem da ich intern sowieso von einer Methode in die andere springe, will sagen: Wenn ich das Programm anhand des Handles in meiner Objectlist gefunden habe übergebe ich das mit dem Index an die Funktion DeleteProgramByIndex. </Edit> <Edit> Titel geändert :-) </Edit> Danke schonmal für eure Antworten, Michael. |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
genau so ist es, der Compiler weiß nicht welche Variante aufgerufen werden soll wenn der Aufruf so aussieht
Delphi-Quellcode:
denn bei 50 ist hier kein Typ angegeben. Desweiteren ist override hier fehl am platz sondern overload muss verwendet werden (override ist zum überschreiben der Vorfahrenmethoden da)
DeleteProgram(50);
|
Re: Override bei Funktion, beide Parameter sind Ganzzahl
du meinst wahrscheinlich nicht override sondern overload ;)
der Compiler sollte nicht meckern....hm interessant ist es schon.... einfach mal ausprobieren und gucken welche Methode wann aufgerufen wird |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
Entweder dun nimmst verschiedene Namen für die Prozeduren (kein Überladen), oder du nimmst den Umweg über eine typisierte Konstante, oder gibst dem Compiler an, was du meinst.
z.B.
Delphi-Quellcode:
Const z50: Integer = 50;
DeleteProgram(z50); DeleteProgram(Integer(50)); @Tyr: der Compiler meckert ... er ruft nicht einfach so blind was auf :warn: |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
Du meinst overload.
Wenn du einen Handle hast, dann benutze auch THandle. Die Funktionen auch mit Longword vs Integer sind moeglich. Der Compiler beschwert sich nicht. Man muss nur aufpassen wie man aufruft. Mit Variablen ist es kein Problem, da der Compiler den Typ feststellen kann. Bei Konstanten muss man wissen welchen Typ der Compiler appliziert. Ein $1 waere ein Cardinal waehrend eine 1 ein Integer ist. Lustig wird es bei einem Integer groesser als MaxInt. Der Compiler macht ein Int64 daraus und was dann beim Downcast passiert ist unklar. |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
Zitat:
PS: Wenn man LonWord/Cardinal und THandle überlädt, wird der Compiler noch schlimmer, da ja THandle von LongWord abgeleitet ist -.-'' |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
Hallo !
Danke erstmal für die schnellen und guten Antworten. Ja ich meine overload :oops: aber ich glaube der Tipp mit den Handle und dem Integer könnte klappen! Wenn ich
Delphi-Quellcode:
nehme sollte das wirklich klappen.
function deleteprogram(Handle: THandle): Boolean; Overload;
function deleteprogram(Index: Integer): Boolean; Overload; Sobald ich das testen kann sag ich euch bescheid ob das klappt, ich hab grad noch n anderen Fehler das ich nichts in meine ObjektListe einfügen kann da ich Exceptions bekomme. P.S.: Compilieren will er schonmal mit dem Overload ;) |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
...grad mal ausprobiert...
Delphi-Quellcode:
so geht es...der Compiler meckert nicht, das einzig wichtige ist der Aufruf
...
private { Private declarations } function DoSomething(AInteger: Integer): String; overload; function DoSomething(ALongWord: LongWord):String; overload; ... ... begin ... NeAndereZahl:= DoSomething(LongWord(EineZahl)); //word oder NeAndereZahl := DoSomething(Integer(EineZahl)); //integer oder auch NeAndereZahl := DoSomething(StrToInt(NeZahlAlsString)); //integer ... end; dort muss explizit gesagt werden was es für ein Typ ist (casten) |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
Ich poste mal kurz n bisschen mehr Code:
Delphi-Quellcode:
unit RunningPrograms;
interface uses Contnrs, Windows, Messages; Type TProgramInformations = class Handle: THandle; Caption: String; End; TRunningPrograms = class Constructor Create; Constructor Destroy; private oPrograms: TObjectlist; Function getIndexbyHandle(Handle: THandle): Integer; Public Function ReadToplevelPrograms: Boolean; Procedure AddProgram(Handle: THandle; Caption: String); Function DeleteProgram(Handle: THandle): Boolean; Overload; Function DeleteProgram(Index: Integer): Boolean; Overload; // Todo: per Override dem Entwickler nur eine Prozedur mit // beiden Parametern abieten Function getCaption(Handle: THandle): String; Overload; Function getCaption(Index: Integer): String; Overload; Function Count: Integer; end; implementation Constructor TRunningPrograms.Create; begin If Not(Assigned(oPrograms)) then oPrograms := TObjectList.Create(True); oPrograms.Clear; end; Constructor TRunningPrograms.Destroy; begin If Assigned(oPrograms) then oPrograms.Free; oPrograms := NIL; end; Function TRunningPrograms.getIndexbyHandle(Handle: THandle): Integer; Var ndx: Integer; Begin Result := -1; If Assigned(oPrograms) then for ndx := 0 to oPrograms.Count - 1 do begin If (oPrograms.Items[ndx] as TProgramInformations).Handle = Handle then Begin Result := ndx; Break; End; end; End; Function TRunningPrograms.ReadToplevelPrograms: Boolean; function GetWindows(const hWnd : THandle; LParam: LPARAM): LongBool; stdcall; var cLen: Longint; strCaption: String; begin Result := True; if (IsWindowVisible(hWnd)) and ((GetWindowLong(hWnd, GWL_HWndPARENT) = 0) or (GetWindowLong(hWnd, GWL_HWndPARENT) = GetDesktopWindow)) and (GetWindowLong(hWnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin cLen := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); if cLen > 0 then begin SetLength(strCaption, cLen); SendMessage(hWnd, WM_GETTEXT, cLen + 1, Longint(Pchar(strCaption))); AddProgram(hWnd, strCaption); end; end; // mit Result = False kann die Callbackfunktion vorzeitig verlassen werden end; Begin If Assigned(oPrograms) then begin EnumWindows(@GetWindows, 1); Result := True; end else Result := False; End; Procedure TRunningPrograms.AddProgram(Handle: THandle; Caption: String); Begin If Assigned(oPrograms) then begin oPrograms.Add(TProgramInformations.Create); //(oPrograms.Last AS TProgramInformations).Handle := Handle; //(oPrograms.Last AS TProgramInformations).Caption := Caption; end; End; Function TRunningPrograms.DeleteProgram(Handle: THandle): Boolean; Var ndx: Integer; Begin ndx := getIndexbyHandle(Handle); If ndx >= 0 then begin Result := DeleteProgram(ndx); end else Result := False; End; Function TRunningPrograms.DeleteProgram(Index: Integer): Boolean; Begin If oPrograms.Count - 1 >= Index then begin oPrograms.Delete(Index); Result := True; end else Result := False; End; Function TRunningPrograms.getCaption(Handle: THandle): String; Begin Result := ''; If Assigned(oPrograms) then If getIndexbyHandle(Handle) >= 0 then Result := getCaption(getIndexbyHandle(Handle)); End; Function TRunningPrograms.getCaption(Index: Integer): String; Begin Result := ''; If Assigned(oPrograms) then IF oPrograms.Count - 1 >= Index then Result := (oPrograms.Items[Index] AS TProgramInformations).Caption; End; function TRunningPrograms.Count: Integer; begin If Assigned(oPrograms) then Result := oPrograms.Count else Result := 0; end; end. In der Funktion AddProgram bekomme ich eine Exception, wisst Ihr warum? Normalerweise müsste das doch klappen wenn die Objektliste erzeugt ist oder? Hab schon öfter Objektlisten benutzt und das hat eigentlich immer geklappt! :gruebel: Hier mal mein Aufruf:
Delphi-Quellcode:
procedure TfrmMain.Button1Click(Sender: TObject);
Var myPrograms: TRunningPrograms; ndx: Integer; str: String; begin myPrograms := TRunningPrograms.Create; If myPrograms.ReadToplevelPrograms then begin for ndx := 0 to myPrograms.Count - 1 do begin ListBox1.Items.Add(myPrograms.getCaption(ndx)); end; end; myPrograms.Free; end; |
Re: Override bei Funktion, beide Parameter sind Ganzzahl
Ist das nicht alles ein wenig krank?
Du willst dem Anwender einerseits einen Gefallen tun, indem Du ihm nur eine Methode zum Löschen anbietest, gleichzeitig ärgerst Du ihn richtig gewaltig, indem Du ihm so eine Typecasting-Falle einbaust. Ich als Anwender traue mir schon zu, mir zwei Methoden zu merken. Also, mach es richtig:
Delphi-Quellcode:
Das ist viel sauberer und stabiler.
DeleteProgramByIndex (aIndex : Integer);
DeleteProgramByHandle(aHandle: THandle); Wenn Du mir eine API mit überladenen Funktionen geben würdest, dann würde ich dich verklagen. Und zwar auf mutwilliges Herbeiführen von haareausraufenden Bugsuchwochenendsessions. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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