2010-11-18 9 views
0

in Delphi 7, eine Klasse deklariert und daraus eine Klasse erstellt (in der Bedeutung uml).Wie kann ich herausfinden, welcher Funktionsaufruf meine Daten korrumpiert?

Die Klasse enthält einen öffentlichen Feldtyp der Zeichenfolgeliste.

nach dem Passieren des Objekts ein paar Mal, der erste Buchstabe in der ersten Zeile ist ausgeblendet.

Wie kann ich es von nicht passiert ???

Aufruf der Funktion, die trimmt ist

stringlist.ValueFromIndex[i]; 

weitere Informationen?

gut ist es so etwas.

type 
    TObjectionFilterFields = class(TObject) 
    private 
    public 
     z,x,c,v,b,n,a,s:integer; 
     list1:TStringList; 
     list2:TStringList; 
     enum:TEnum; 
     constructor Create; //override; 
     destructor Destroy; //override; 
    end; 

Jetzt rufen wir bei einem Objekt create auf, fügen Daten ein und übergeben es weiter. auf einem anderen Objekt greifen wir die Daten und erstellen eine Zeichenfolge daraus, mit + Konkatation.

for i := 0 to list1.count-1 
sql.add(''''+list1.ValueFromIndex[i] + ''''+'hdsjkf'); 

envoking stringlist.Strings [i] löste es

dank

+0

Können Sie bitte etwas mehr Informationen und vorzugsweise etwas Code geben. –

+0

Können Sie uns sagen, was das Name/Wert-Paar ist? Das fehlende Zeichen ist nicht das Name/Wert-Trennzeichen, oder? Normalerweise ist es ein Gleichheitszeichen (=). Spätere Versionen von Delphi lassen Sie es über TStrings.NameValueSeparator setzen, aber ich weiß nicht, ob das in D7 existierte. Sie könnten die rohe Zeichenkette mit der Zeichenkettenliste [i] überprüfen (sollte etwas wie "Name = Wert" sehen). – WileCau

+0

Ich nehme an "für i = zu list1.count-1" muss sein "für i = ** 0 ** zu list1.count-1" –

Antwort

1

Soweit ich verstehen kann. Sie haben ein Objekt, das ein öffentliches Feld des Typs TStringList enthält.

type 
    TMyClass = class 
    FField : TStringList; 
    end; 

Sie haben eine Instanz erstellt und an eine Funktion übergeben.

var 
    instance : TMyClass; 

begin 
    instance := TMyClass.Create; 
    try 
    DoSomething(instance); 
    finally 
    instance.Free; 
    end; 
end; 


procedure DoSomething(AObject: TMyClass); 
begin 
    // Check here 
    DoSomethingElse(AObject); 
    // Check here 
end; 

procedure DoSomethingElse(AObject: TMyClass); 
begin 
    // Check here 
end; 

Sie können den Status des Objekts an jedem Ein- und Ausstiegspunkt jeder Funktion überprüfen, um herauszufinden, wann die Änderung eintritt. Poste diesen Code, wenn du das Problem nicht selbst finden kannst.

Bitte beachten Sie, dass die Verwendung öffentlicher Felder gefährlich sein kann, da alles auf dieses Feld zugreifen und dieses ändern kann.

+0

Ich begann mit Rekord, aber ich fand es Probleme gibt den Wert von String.Also habe ich diese Idee aufgegeben, und die Kapselung mit Nachfolgern zu modifizieren, wird einige Arbeit erfordern. – none

Verwandte Themen