Entwickler-Ecke

Sonstiges (Delphi) - Merkwürdiger Fehler


mcbrunox - Fr 21.02.03 15:41
Titel: Merkwürdiger Fehler
hallo,
bei diesem code tritt immer ein fehler auf, weis aber nicht wieso.
auch wenn ich vorher keyname.clear nehme <ist der fehler wieder dort.
"zugriffsverlezung an adresse ...."


Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
var keyname:tstrings;
begin
  keyname.add('123123');
end;


mach ich hier einen fehler oder liegts an delphi :roll:


foxy - Fr 21.02.03 15:43

nein schau

du hast keyname als tstrings deklariert ...

wenn du nur add machst, brauchst du auch Tstrings und keinen normalen string

also machst du es weder so

Ungetestet:


Quelltext
1:
Keyname.add[1]('1234');                    

oderKeyname.add.lines('1234');

wie gesagt habs nicht getestet ...


mcbrunox - Fr 21.02.03 15:54

gut mit tstringlist.create; eine zeile vorher hats geklappt...
aber wieso kann er die key's nicht einlesen ?

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var reg:tregistry;
    w,w2,i:integer;
    keys,s:string;
    keyname:tstrings;
begin
  Reg:=Tregistry.Create;
  reg.RootKey:=HKEY_CURRENT_USER;
  Reg.OpenKey('Identities',true);
  tstringlist.create;                          // << mit dem gehts auch
  reg.GetKeyNames(keyname);i:=0;    // jetzt ist hier der fehler
...
...
end;

ich machs so wie in der beschreibung mit tstrings aber der ...schmarrn[/code]


Keldorn - Fr 21.02.03 15:57

wo weißt Du denn keyname zu? von keyname gibts keine instanz

Quelltext
1:
keyname := TStringList.Create;                    


Zitat:

ich machs so wie in der beschreibung mit tstrings aber

das steht dort bestimmt nicht so drin :roll:


Frank


mcbrunox - Fr 21.02.03 16:02

hast recht..jetzt probier ich schon stundenlang,,,komm nicht mal auf die idee in google nachzuschaun und dann dass hier...sorry :arrow:

danke trotzdem


Keldorn - Fr 21.02.03 16:05

wieso google?
f1 reicht - dort ist auch ein schönes Beispiel inkl. Try-Block drin


Anonymous - Fr 21.02.03 17:03

Paar Tips noch:

- Wo ein Create, da auch ein Free. Das ist ein Muß. Wenn du also ein Create anwendest, dann mußt du diese Variable auch mit Free freigeben. Objekte sind nicht wie normale Variablen. Der Speicherplatz wird nicht automatisch beim beenden der Prozedur oder Programms wieder freigegeben.

- Wo ein Create, da auch ein try..finally. Das ist jetzt kein Muß wie mit Free, aber bei einem Fehler wird eventuell Free nicht ausgeführt. Deshalb muß du es mit Finally erzwingen.

Hier ein Beispielcode vie man es machen sollte:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    //... mach was
  finally
    sl.Free;
  end;
end;


Das ist das Minimum beim Arbeiten mit Objekten.

Noch ein kleiner Tip zum Schluß. Tippe das Wort try in Delph ein und Drücke dann gleichzeitig STRG + J. Es öffnet sich ein kleines Fenster in dem du etwas auswählen kannst. Gleich an der ersten Stelle findest du den Schutzblock für Objekt-Variablen. Einfach bestätigen und das kommt raus:


Quelltext
1:
2:
3:
4:
5:
6:
  variable := typename.Create;
  try

  finally
    variable.Free;
  end;

Jetzt braucht man nur noch variable und typename ersetzen und schon hat man nichts vergessen.