Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Variable verliert Wert nach der Zuweisung (https://www.delphipraxis.net/100446-variable-verliert-wert-nach-der-zuweisung.html)

Luckie 28. Sep 2007 10:58


Variable verliert Wert nach der Zuweisung
 
Ich habe hier ein mir unerklärliches Phänomen. Ich habe eine lokale WideString-Variable s1. Dieser weise ich einen Wert zu und lasse sie mir direkt in der nächsten Zeile ausgeben:
Delphi-Quellcode:
s1 := 'Test';
ShowMessage(hDlg, s1);
Das ganze findet in einer Dialogprozedur statt. Ist aber unerheblich, weil die Prozedur nicht verlassen wird zwischen den beiden Zeilen. Allerdings ist s1 leer. Im Debugger steht "nicht verfügbarer Wert" und die MessageBox ist leer. Optimierung habe ich schon ausgeschaltet.

Benutze ich SetString:
Delphi-Quellcode:
SetString(s1, PwIDEChar('Test'), 4);
geht es.

Was ist da los?

Ich werde noch mal irre, jetzt geht es wieder nicht mehr.

So sieht es aus:
Delphi-Quellcode:
ShowMessage(hDlg, GetItemTextW(hDlg, ID_EDT_COMP_X));
Computer := GetItemTextW(hDlg, ID_EDT_COMP_X);
User := GetItemTextW(hDlg, ID_EDT_ACCOUNT_X);
In ShowMessage wird alles noch richtig angezeigt, also GetItemText funktioniert, aber wenn er bei User := ist, und ich halte die Maus über Computer, wird mir "nicht verfügbarer Wert" angezeigt (die Variable wird später noch benutzt). :wall:

Entwicklungsumgebung ist D6 Professional.

peschai 28. Sep 2007 11:00

Re: Variable verliert Wert nach der Zuweisung
 
Hallo

Kannst du die ganze funktion schicken incl VAR parameter etc ...

Luckie 28. Sep 2007 11:12

Re: Variable verliert Wert nach der Zuweisung
 
Siehe mein Edit oben:

Delphi-Quellcode:
function GetItemTextW(hParent: THandle; ID: Integer): WideString;
var
  p                : PWideChar;
  len              : Integer;
  s                : WideString;
begin
  s := '';
  len := SendDlgItemMessageW(hParent, ID, WM_GETTEXTLENGTH, 0, 0);
  if len > 0 then
  begin
    try
      p := GetMemory(len+1);
      if Assigned(p) then
      begin
        GetDlgItemTextW(hParent, ID, p, len+1);
        SetString(s, p, len+1);
      end;
    finally
      FreeMemory(p);
    end;
  end;
  result := s;
end;
Und die Deklaration:

Delphi-Quellcode:
var
    Computer         : WideString;
Mehr ist es nicht.

Luckie 28. Sep 2007 11:26

Re: Variable verliert Wert nach der Zuweisung
 
Neuer Versuch: Ich habe es jetzt so:
Delphi-Quellcode:
ShowMessage(hDlg, GetItemTextW(hDlg, ID_EDT_COMP_X));
Computer := SysAllocString(PWideChar(GetItemTextW(hDlg, ID_EDT_COMP_X)));
ShowMessage(hDlg, Computer);
//User := GetItemTextW(hDlg, ID_EDT_ACCOUNT_X);
//PW := GetItemTextW(hDlg, ID_EDT_PW_X);

//DisconnectNetworkDrivew(CurComputer);
ret := ConnectToNetworkDriveW('', Computer + '\IPC$',
In beiden ShowMessages steht der Computername, aber im Funktionsaufruf von ConnectToNetWorkDriveW steht dann "nicht verfügbarer Wert", wen ich dort mit dem Debugger stoppe.

peschai 28. Sep 2007 12:27

Re: Variable verliert Wert nach der Zuweisung
 
Hallo

Mal so ein Gedanke ... Unerklärliches ist oftmals auf SpeicherÜberschreiber zurückzuführen ...

Könntest du mal probieren bei
Delphi-Quellcode:
GetDlgItemTextW(hParent, ID, p, len+1);
        SetString(s, p, len+1);
die stellen "len+1" nur "len" zu verwenden ? Auch wenn die Länge dann nicht stimmen sollte, wäre interessant ob dann der gleiche Fehler auftritt.

Desweiteren check doch mal alle stellen wo du was mit "Computer" machst. Du hats den Speicher dynamisch dazu anlegen lassen, verwendust du auch die richtigen free mthoden dafür ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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