Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Frage zu MAC Adresse auslesen (https://www.delphipraxis.net/91728-frage-zu-mac-adresse-auslesen.html)

Mackhack 9. Mai 2007 08:12


Frage zu MAC Adresse auslesen
 
Hi DPler,

ich habe hier den Code in eine Unit gepackt und wollte den grad mal testweise benutzen.

Jedoch steht da jetzt immer nur eine Zahl in der Caption von meiner Form.

Weis jemand warum? Der Codeausschnitt ist aus der FormCreate Methode!

Delphi-Quellcode:
  [...]
  SL := TStringList.Create;
  for I := 0 to 5 do
  begin
    SL.Add(String(uGetMACAddress.getSystemMACAddresses[I]));
    Caption := SL.Text[I];
  end;
end;

SirThornberry 9. Mai 2007 08:17

Re: Frage zu MAC Adresse auslesen
 
Zitat:

Jedoch steht da jetzt immer nur eine Zahl in der Caption von meiner Form.

Weis jemand warum?
Weil genau das im Quelltext steht :)

Delphi-Quellcode:
SL.Text
Gibt den gesamten Inhalt einer Stringliste zurück ('zeile1'#13#10'zeile2'#13#10'zeile3'#13#10)
mit
Delphi-Quellcode:
SL.Text[i]
bekommst du also nur das Zeischen Nummer i aus diesem String.

Bernhard Geyer 9. Mai 2007 08:18

Re: Frage zu MAC Adresse auslesen
 
Die MAC-Adresse ist ja auch eine Zahl. Nur ist eine Zahl wie 12343238 sehr schlecht lesbar, deshalb wird sie (für IP-V4) für die Eingabe/Anzeige in die Bytewerte aufgeteilt und mit : getrennt

Mackhack 9. Mai 2007 08:20

Re: Frage zu MAC Adresse auslesen
 
Hi,

danke. Haette ich das ganze so gemacht

Delphi-Quellcode:
  Caption := SL.Text;
ist die ganze Caption leer! Oder hab ich jetzt was uebersehen?

SirThornberry 9. Mai 2007 08:26

Re: Frage zu MAC Adresse auslesen
 
hast du dir mal im Debugger den Wert von sl.text anzeigen lassen? Oder hast du anstelle das in die Caption zu schreiben mal per showmessage ausgegeben?
Wenn du folgenden String einer Caption zuweist siehst du nichts mehr davon:
'Zeile1'#13#10'Zeile2'#13#10'Zeile3'#13#10'Zeile4' #13#10'Zeile5'#13#10

In der Caption wird daraus (X=nicht darstellbares zeichen): Zeile1XXZeile2XXZeile3XXZeile4XXZeile5XX
durch die Zeilenumbrüche (die nicht dargestellt werden) rutscht die Caption nach oben (also aus der Titelleiste raus) so das du davon nichts mehr siehst. Nutze einfach den Debugger etwas dann siehst du die richtigen Werte.

Mackhack 9. Mai 2007 08:31

Re: Frage zu MAC Adresse auslesen
 
Hi,

ich habe grad in der Zeit als du wohl schriebst den Debugger in der Tat verwendet und ich habe nach dem gesamten Durchlauf 3 vollstaendige MAC Adressen drin gehabt in Caption.

Das verstehe ich jetzt nicht wirklich. Ich habe doch nur einen Onboard LAN Adapter drin. Wenn ich aber mit der ShowMessage arbeite bekomme ich eine MAC angezeigt, dann 6 MAC's untereinander geschrieben in der ShowMessage.

Weis wer wo die anderen herkommen?

SirThornberry 9. Mai 2007 08:41

Re: Frage zu MAC Adresse auslesen
 
liefert dir denn GetSystemMacAdresses wirklich 6 Adressen zurück oder liegt es vielleicht einfach nur daran das du deine schleife hart von 0 bis 5 durchlaufen lässt?

Im übrigen hast du dir da ein riesen Speicherleck geschaffen.
Durch den Aufruf von GetSystemMacAdresses wird eine Stringlist initialisiert welche dir zurück gegeben wird. Diese gibst du allerdings nirgends frei sondern rufst stattdessen die Funktion sogar 6 mal auf ohne einmal die zurückgegebene Stringlist frei zu geben. Eben um so etwas zu vermeiden werden funktionen die Listen füllen in der Regel so declariert.
Delphi-Quellcode:
function GetSystemMacAdresses(ADestList: TStringList): Irgendwas;
somit ist der Nutzer gezwungen die Liste(das Object) vorher anzulegen und weiß damit auch sofort das er sich um die Freigabe auch selbst kümmern muss. Es hindert dich niemand dran als Ergebnis die Stringliste auch als Funktionsergebnis zurück zu geben aber du solltest in einer Funktion keine Stringliste erstellen und zurückgeben.
Delphi-Quellcode:
function GetSystemMacAdresses(ADestList: TStringList): TStringList;
begin
  [...]
  result := ADestList;
end;
Generell sollte man in Funktionen nie ein Object erstellen welches per Result zurück gegeben wird.
Denn der Endanwender weiß dann nicht ob er sich selbst um die Freigabe kümmern muss oder ob die Freigabe von der Klasse gemanged wird.
Zudem kommt es auch des öfteren vor das man eine Funktion aufruft ohne das Funktionsergebnis zu verwenden (denn nicht alle werten Funktionsergebnisse aus um heraus zu finden ob der Aufruf erfolgreich war etc.).

Mackhack 9. Mai 2007 08:46

Re: Frage zu MAC Adresse auslesen
 
Zitat:

Zitat von SirThornberry
liefert dir denn GetSystemMacAdresses wirklich 6 Adressen zurück oder liegt es vielleicht einfach nur daran das du deine schleife hart von 0 bis 5 durchlaufen lässt?

Wegen der Schleife die ich von 0 bis 5 laufen lasse! Aber was sind das dann fuer Werte? Zufallswerte? Und warum bekomme ich wenn das Obere Schleifenende 6 oder mehr ist einen Out of Bound Fehler? Ich hab ja mit 0 to 5 schon mehr MAC Adressen als ich in Wirklichkeit habe.

Zitat:

Zitat von SirThornberry
Im übrigen hast du dir da ein riesen Speicherleck geschaffen.

Weis ich. Diese Funktion auch nicht von mir, hast aber recht :???:

::Edit:: Und wie kann ich das sonst noch machen ausser mit einer for Schleife da ich ja wie gesagt nur eine MAC Adresse haben kann in meinem PC! Also am Besten das ganze Dynamisch falls mal ein PC da steht mit mehr als einer NIC!

Klaus01 9. Mai 2007 08:56

Re: Frage zu MAC Adresse auslesen
 
Vielleicht geht es so besser?

Delphi-Quellcode:
[...]
begin
  SL := TStringList.Create;
  SL.Assign(uGetMACAddress.getSystemMACAddresses);
  for i:=0 to Sl.count -1 do
    // Ausgabe mac Addresses
  SL.free;
end;
Aber das Speicherleck hast Du dann noch immer.

Grüße
Klaus

Mackhack 9. Mai 2007 09:00

Re: Frage zu MAC Adresse auslesen
 
Danke Klaus.

Hier auch wieder. 6 mal ne ShowMessage mit insgesamt 6 MACs!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.
Seite 1 von 2  1 2      

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