AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi wieso werden PChar Werte im dyn. Array gelöscht?
Thema durchsuchen
Ansicht
Themen-Optionen

wieso werden PChar Werte im dyn. Array gelöscht?

Ein Thema von n00b2key · begonnen am 5. Sep 2004 · letzter Beitrag vom 7. Sep 2004
Antwort Antwort
n00b2key

Registriert seit: 3. Jan 2003
11 Beiträge
 
#1

wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 5. Sep 2004, 23:24
Hi@ll

frage steht oben, hab keine ahnung wieso alle werte auf '' zurück gesetzt werden?! hier der code:

Code:
type
 TDrives = record
   Device : Byte;
   Drive : PChar;
 end;

 TForm1 = class(TForm)
 private
   aDrives: Array of TDrives;
   DriveBtns: Array of TBitBtn;
   procedure List_Drives;
   procedure CreateDriveBtns;
   { Private-Deklarationen }
 public
   { Public-Deklarationen }
 end;

const
 DRIVE_UNKNOWN = 0;
 DRIVE_NO_ROOT_DIR = 1;
 DRIVE_REMOVABLE = 2;
 DRIVE_FIXED = 3;
 DRIVE_REMOTE = 4;
 DRIVE_CDROM = 5;
 DRIVE_RAMDISK = 6;

procedure TForm1.List_Drives;
begin
// speichert den Drive Index und den Laufwerksbuchstaben (zB 'C:\') im aDrives Array
end;

procedure TForm1.CreateDriveBtns;
var
   i:Byte;
begin
 List_Drives;
 SetLength(DriveBtns, length(aDrives));
 for i := low(aDrives) to High(aDrives) do
 begin
   DriveBtns[i] := TBitBtn.Create(self); // <- Nach diesem Befehl werden die Daten im aDrives Array gelöscht (Nur die Laufwerksbuchstaben und nicht die Indexe)?!?!
   DriveBtns[i].Parent := Panel1;
   DriveBtns[i].Top := i*30;
   DriveBtns[i].Caption := string(aDrives[i].Drive);
 end;
end;
Ich bin n00b und das ist auch gut so!
  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: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 5. Sep 2004, 23:36
mich würde der Inhalt von
Delphi-Quellcode:
procedure TForm1.List_Drives;
begin
// speichert den Drive Index und den Laufwerksbuchstaben (zB 'C:\') im aDrives Array
end;
interessieren. Ich vermute du forderst keinen Speicher für "Drive : PChar;" an.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
n00b2key

Registriert seit: 3. Jan 2003
11 Beiträge
 
#3

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 6. Sep 2004, 00:06
Code:
procedure TForm1.List_Drives;
var
 r: LongWord;
 Drives: array[0..128] of char;
 pDrive: PChar;
begin
 SetLength(aDrives,0);
 r := GetLogicalDriveStrings(SizeOf(Drives), Drives);
 if r = 0 then Exit;
 if r > SizeOf(Drives) then
   raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY));
 pDrive := Drives;
 while pDrive^ <> #0 do
 begin
   SetLength(aDrives, Length(aDrives)+1);
   if GetDriveType(pDrive) = DRIVE_UNKNOWN then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_UNKNOWN;
   end;
   if GetDriveType(pDrive) = DRIVE_NO_ROOT_DIR then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_NO_ROOT_DIR;
   end;
   if GetDriveType(pDrive) = DRIVE_REMOVABLE then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_REMOVABLE;
   end;
   if GetDriveType(pDrive) = DRIVE_FIXED then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_FIXED;
   end;
   if GetDriveType(pDrive) = DRIVE_REMOTE then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_REMOTE;
   end;
   if GetDriveType(pDrive) = DRIVE_CDROM then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_CDROM;
   end;
   if GetDriveType(pDrive) = DRIVE_RAMDISK then
   begin
     aDrives[High(aDrives)].Drive := pDrive;
     aDrives[High(aDrives)].Device := DRIVE_RAMDISK;
   end;

   Inc(pDrive, 4);
 end;
 SetLength(DriveBtns, Length(aDrives));
end;
Ich bin n00b und das ist auch gut so!
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#4

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 6. Sep 2004, 01:29
Du kannst das ganze verkürzen...
Delphi-Quellcode:
type
  TDrives = record
    Device: LongWord;
    Drive: String;
  end;

var
  Drives: array of TDrives;

procedure TForm1.FormCreate(Sender: TObject);
var
  LogicalDrives: DWORD;
  I: Integer;
begin

  LogicalDrives := GetLogicalDrives;

  for I := 0 to 25 do
    if LogicalDrives and (1 shl I) <> 0 then
    begin

      SetLength(Drives, Length(Drives) + 1);

      with Drives[High(Drives)] do
      begin
        Drive := Chr(I + Ord('A')) + ':\';
        Device := GetDriveType(PChar(Drive));
      end; {end with}

    end; {end if}

end; {end procedure}
  Mit Zitat antworten Zitat
n00b2key

Registriert seit: 3. Jan 2003
11 Beiträge
 
#5

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 7. Sep 2004, 02:18
Ah thx@Sprint

ich verstehe diese zeile nicht so ganz:
Code:
 if LogicalDrives and (1 shl I) <> 0 then
und diese funktion auch nicht:
Code:
GetLogicalDrives
also der variablen LogicalDrives wird mit hilfe von GetLogicalDrives ein DWORD-Wert zugeordnet. Was genau bedeutet dieser Wert? Was muss ich genau machen, um möglichst schnell selber auf eine Antwort zu kommen, wo muss man da nachschauen?

wieso müssen die/beide Bits von LogicalDrives und 1 shl i an irgend einer stelle 1 bzw True sein, damit ein Ergebnis <> 0 zustande kommen kann? (Wenn man den Wert von LogicalDrives versteht, wird man denke ich diese Frage auch beantworten können)

Eine letzte Frage noch: Wie kommst du bzw die anderen "cracks" immer auf solche funktionen? man muss doch mal etwas vergessen oder schlägst du die immer nach? Mich Interessiert einfach nur die Methodik, wie man zu solchen Funktionen kommt.
Ich bin n00b und das ist auch gut so!
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#6

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 7. Sep 2004, 02:51
Zitat von n00b2key:
also der variablen LogicalDrives wird mit hilfe von GetLogicalDrives ein DWORD-Wert zugeordnet. Was genau bedeutet dieser Wert? Was muss ich genau machen, um möglichst schnell selber auf eine Antwort zu kommen, wo muss man da nachschauen?
GetLogicalDrives ist eine WinAPI Funktion. Und wenn du das Platform SDK von Microsoft installiert hast, dann findest sehr
schnell die Bedeutung der Funktion. Alternativ kannst du nachtürlich auch bei msdn.microsoft.com schauen.

Zitat:
The GetLogicalDrives function retrieves a bitmask representing the currently available disk drives.
If the function succeeds, the return value is a bitmask representing the currently available disk drives. Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on.

If the function fails, the return value is zero.
Ich denke jetzt mal, das du jetzt weißt warum ich diese Zeile geschrieben habe...
if LogicalDrives and (1 shl I) <> 0 then
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 7. Sep 2004, 07:09
@n00b2key

Die Ursache deines Probs lag wohl vor allem auch primär daran, dass du "Drive" (Char) in dieser vorher aufgerufenen "List_Drives"-Procedure dann jedoch letztlich (mittels pDrive Char) nur irgendwo auf eine dort bloß lokale Variable (Drives:array[X..Y]...) pointen ließest.

Und lokale Variable lösen sich dann aber immer in Luft auf, wenn die Routine, in der sie standen, schließlich returniert!

(...nur der Vollständigkeit halber).
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
n00b2key

Registriert seit: 3. Jan 2003
11 Beiträge
 
#8

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 7. Sep 2004, 12:40
Aha, thx@ll

Ich saug mir grad dieses SDK ( http://www.microsoft.com/msdownload/.../psdk-full.htm ) es ist 342MB gross und extrahiert ist es dann ~1,4 Gig...ist das normal oder saug ich mir grad was falsches?
Ich bin n00b und das ist auch gut so!
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#9

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 7. Sep 2004, 16:16
Zitat von n00b2key:
ist das normal oder saug ich mir grad was falsches?
Das ist das richtige. Hab ich ja schon öfters im WinAPI Forum auf pb gepostet.
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: wieso werden PChar Werte im dyn. Array gelöscht?

  Alt 7. Sep 2004, 16:33
Zitat von n00b2key:
Eine letzte Frage noch: Wie kommst du bzw die anderen "cracks" immer auf solche funktionen? man muss doch mal etwas vergessen oder schlägst du die immer nach? Mich Interessiert einfach nur die Methodik, wie man zu solchen Funktionen kommt.
das ist einfach nur erfahrung...
wenn du sowas schon eine ganze weile immer machst (durch nachschlagen oder in foren fragen), dann kannst du das bald von ganz allein. das ist, wie autohfahren: wenn du ab und zu eine strecke fährst (von der arbeit nach hause zB), dann kannst du sie schon bald "wie im schlaf" (was natürlich gefährlich wäre )

Aenogym
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:30 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