Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   AcessViolation? (https://www.delphipraxis.net/149313-acessviolation.html)

Sanguis 18. Mär 2010 17:22

Datenbank: SQLite • Version: 3 • Zugriff über: ASQLite Komponenten

AcessViolation?
 
Hallo,

leider habe ich schon wieder ein Problem. Sorry, falls ich nerve.

Ich habe folgende Function:
Delphi-Quellcode:
function getWNamenByID(id:String):TStrings;
var sl:TStrings;
begin
roster.sqldings.Active := false;
 roster.sqldings.SQL.Clear;
 roster.sqldings.SQL.Add('SELECT * FROM namen where workerID = ' +id+';');
 roster.sqldings.Active := true;

 sl.create;
 //sl.Clear;
 while not roster.sqldings.Eof do begin
 sl.Add(kalender.sqldings.FieldByName('name').AsString);
 roster.sqldings.Next;
 end;
 
 Result := sl;
 sl.Free;
end;
Der Aufruf sieht so aus:
Delphi-Quellcode:
roster.namen.Items.AddStrings(func.getWNamenByID(wid.Caption))
Leider bekomme ich (laut Haltepunkt) beim Aufruf eine AccessViolation und ich weiß nicht wieso...

Gruß,
Andreas

p80286 18. Mär 2010 17:25

Re: AcessViolation?
 
Du solltest einmal
Delphi-Quellcode:
sl:=tStringList.create;
versuchen.

Und der Hinweis auf Parameter war ernst gemeint!

Gruß
K-H

Sanguis 18. Mär 2010 17:32

Re: AcessViolation?
 
Hallo,

danke für die Hilfe. Die AV ist jetzt weg. Allerdings stehn in der ListBox (namen) keine Einträge.

Das mit den Parametern muß ich erst lernen. Ich versteh das noch nicht ganz. Aber ich bin dabei, darüber zu lesen. Dauert nur leider.

Gruß,
Andreas

p80286 18. Mär 2010 17:41

Re: AcessViolation?
 
nach "sl.free;" gibt es auch nichts mehr zum Anzeigen.

Delphi-Quellcode:
Query.sql.text:='select * from tabelle where wert=:_parameter';
Query.sql.parambyname('_parameter').asstring:='12345';
Vorsicht! Die Parameterübergabe ist nicht bei allen Komponenten gleich!

Gruß
K-H

Sanguis 18. Mär 2010 17:49

Re: AcessViolation?
 
Danke, das wars. Ich hatte das sl.free; extra nach der Reultübergabe geschrieben, weil ich dachte die sl wird dann nicht mehr gebraucht und schreibt nur den Speicher voll. Wenn ich das sl.free; auskommentiere, gehts aber, danke!

Für die Parameter, lese ich grad in den Aducom Samples rum.

Gruß und Dank,
Andreas

Sanguis 18. Mär 2010 18:07

Re: AcessViolation?
 
Blöde Frage... aber gibt es die Möglichkeit bei einem Element der Stringlist den Tag zu übergeben? Ich möchte da gerne die ID des Datensatzes rein schreiben, weil die ausgelesenen "namen" doppelt sein können.

Sir Rufo 18. Mär 2010 18:45

Re: AcessViolation?
 
Ich hätte da noch einen Vorschlag für das Design deiner Funktion:

Das macht man so nicht:
Delphi-Quellcode:
function TuWas1 : TStrings;
begin
end;
Besser:
Delphi-Quellcode:
procedure TuWas2( StrLst : TStrings );
begin
end;
Grund:

Hier kann es knallen ... und könnte nur mit einem try...except abgefangen werden
Delphi-Quellcode:
procedure TestVonTuWas1;
  var
    sl : TStrings;
  begin
    sl := TuWas;
    // sl kann jetzt initialisiert sein, muss aber nicht
    sl.Free; // <- hier kann es zu einer AV kommen
  end;
Hier habe ich das Erzeugen und Zerstören selber in der Hand
Delphi-Quellcode:
procedure TestVonTuWas2;
  var
    sl : TStrings;
  begin
    sl := TStringList.Create;
    try
      TuWas2( sl );
    finally
      sl.Free;
    end;
  end;
Zu den IDs und der Stringlist ... das geht so naja

Der richtige Weg führt über entsprechende Daten-Klassen die in einer ObjectList gespeichert werden.
Den ListView-Inhalt lässt man einfach virtuell von der ObjectList füllen.

Stichworte dazu Delphi-Referenz durchsuchenTListView.OwnerData Delphi-Referenz durchsuchenTListView.OnData

Luckie 18. Mär 2010 18:47

Aussagekräftiger Titel
 
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.

defede 18. Mär 2010 18:50

Re: AcessViolation?
 
Hallo,
du könntest die Doppelten Einträge mit der Stringlist vermeiden.
So etwa:
sL.Sorted := true; //Muss vorher gesetzt werden!
sL.Duplicates := dupIgnore;

Wenn du ID's in die Stringlist mit packen möchtest dann solltest du nicht
"Add" nehmen sondern mit dem Object der Stringlist Arbeiten.
So etwa:
sL.AddObject('meinText',TObject(EineZahl));
Auslesen ist dann auch ganz einfach. Findest hier garantiert 1000 Beispiele dafür.

Sanguis 18. Mär 2010 23:18

Re: AcessViolation?
 
Guten Abend,

ich danke Euch. Die doppelten Einträge, sind Absicht. Aber mit dem AddObject habe ich es hinbekommen. Vielen Dank!

Leider fällt mir kein besserer Titel für den Thread ein...

Gruß,
Andreas


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