AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Overload bei Funktion, beide Parameter sind Ganzzahl
Thema durchsuchen
Ansicht
Themen-Optionen

Overload bei Funktion, beide Parameter sind Ganzzahl

Ein Thema von mika · begonnen am 2. Sep 2005 · letzter Beitrag vom 2. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#1

Overload bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 13:43
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:
  function DeleteProgramByHandle(Handle: Longword): Boolean;
  function DeleteProgramByIndex(Index: Integer): Boolean;
Ich hätte das aber lieber mittels Override für den anwendenden Entwickler allgemeiner gestaltet
wie zum Beispiel:

Delphi-Quellcode:
  function DeleteProgram(Handle: Longword): Boolean; Override;
  function DeleteProgram(Index: Integer): Boolean; Override;
Das ich einfach nur .DeleteProgram aufrufen muss, da aber beide Parameter Ganzzahlen sind denke ich
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.
:: don't Panic ::
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 13:47
genau so ist es, der Compiler weiß nicht welche Variante aufgerufen werden soll wenn der Aufruf so aussieht
DeleteProgram(50); 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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 13:51
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
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#4

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 13:51
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 13:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#6

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 13:59
Zitat von Robert Marquardt:
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.
Also also bei D7 & D4 bekomm ich öfters mal beschwerden vom Compiler, wenn ich sowas versuche.

PS: Wenn man LonWord/Cardinal und THandle überlädt, wird der Compiler noch schlimmer,
da ja THandle von LongWord abgeleitet ist -.-''
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#7

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 14:03
Hallo !

Danke erstmal für die schnellen und guten Antworten. Ja ich meine overload aber
ich glaube der Tipp mit den Handle und dem Integer könnte klappen!

Wenn ich
Delphi-Quellcode:
  function deleteprogram(Handle: THandle): Boolean; Overload;
  function deleteprogram(Index: Integer): Boolean; Overload;
nehme sollte das wirklich klappen.

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
:: don't Panic ::
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 14:07
...grad mal ausprobiert...

Delphi-Quellcode:
...
  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;
so geht es...der Compiler meckert nicht, das einzig wichtige ist der Aufruf
dort muss explizit gesagt werden was es für ein Typ ist (casten)
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#9

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 14:11
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!

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;
:: don't Panic ::
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Override bei Funktion, beide Parameter sind Ganzzahl

  Alt 2. Sep 2005, 14:17
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:
DeleteProgramByIndex (aIndex : Integer);
DeleteProgramByHandle(aHandle: THandle);
Das ist viel sauberer und stabiler.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz