Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST - IncrementalSearch -> Access violation (https://www.delphipraxis.net/117169-vst-incrementalsearch-access-violation.html)

100nF 13. Jul 2008 13:00


VST - IncrementalSearch -> Access violation
 
Hallo zusammen,

Also ich habe einen VST mit der IncrementalSearch-Funktion "ausgerüstet".
Eigentlich funktioniert das wunderbar, doch wenn ich zwei mal hintereinander die selbe Taste auf der Tastatur (= selber Buchstabe) drücke, gibts eine "access violation".

Ich finde einfach nicht heraus, was das Problem ist!
Vielleicht kann ja von euch jemand helfen...

Hier mal bisschen Code, wenn ihr mehr braucht sagt bescheid.
Delphi-Quellcode:
type
  TArchiv = class(TComponent)
  private
    fFilename: String;
    fTitel: String;
    fInterpret: String;
    fAlbum: String;
    fGenre: String;
    fDauer: TTime;
    fBewertung: Integer;
    fCounter: Integer;
    fDatum: TDate;


    function getPlaylistname: String;
  published
    property Filename:    String read fFilename write fFilename;
    property Titel:       String read fTitel write fTitel;
    property Interpret:   String read fInterpret write fInterpret;
    property Album:       String read fAlbum write fAlbum;
    property Genre:       String read fGenre write fGenre;
    property Dauer:       TTime read fDauer write fDauer;
    property Bewertung:   Integer read fBewertung write fBewertung;
    property Counter:     Integer read fCounter write fCounter;
    property Datum:       TDate read fDatum write fDatum;

    property Playlistname: String read getPlaylistname;

  public

end;
pArchiv = ^TArchiv;

//...

procedure TForm1.VST1IncrementalSearch(Sender: TBaseVirtualTree;
  Node: PVirtualNode; const SearchText: WideString; var Result: Integer);
var
  s1, s2: string;
  Archiv: TArchiv;
begin

  Archiv := TArchiv(vst1.getnodedata(node)^); // <--- Diese Zeile wird markiert bei der acces violation

  s1 := SearchText;

  case vst1.Header.SortColumn of
    0: s2 := Archiv.Filename;
    1: s2 := Archiv.Titel;
    2: s2 := Archiv.Interpret;
    3: s2 := Archiv.Playlistname;
    4: s2 := Archiv.Album;
    5: s2 := Archiv.Genre;
    6: s2 := formatdatetime('HH:MM:SS', Archiv.Dauer);
    7: s2 := Inttostr(Archiv.Bewertung);
    8: s2 := Inttostr(Archiv.Counter);
    9: s2 := DateTimeToStr(Archiv.Datum);
  end;

  if s2 = '' then
    s2 := ' ';
 
  Result := StrLIComp(pchar(lowercase(s1)), PChar(lowercase(s2)), Min(Length(s1), Length(s2)));
end;
wäre echt dankbar wenn mir jemand helfen könnte!

MFG
urbanbruhin

mkinzler 13. Jul 2008 13:09

Re: VST - IncrementalSearch -> Access violation
 
Versuch mal
Delphi-Quellcode:
Archiv := TArchiv( Sender.getnodedata(node));

100nF 13. Jul 2008 13:19

Re: VST - IncrementalSearch -> Access violation
 
geht auch nicht, so kommt schon beim ersten buchstaben eine access violation...

mkinzler 13. Jul 2008 13:22

Re: VST - IncrementalSearch -> Access violation
 
Dann verzichte auf den Cast
Delphi-Quellcode:
Archiv: PArchiv;
begin

  Archiv := Sender.getnodedata(node);

mirage228 13. Jul 2008 13:26

Re: VST - IncrementalSearch -> Access violation
 
Arbeitet man bei den Node-Daten nicht üblicherweise mit records (und Pointern darauf -- und nicht mit Klassen, wie hier)? Ist NodeDataSize korrekt initialisert?

mfG
mirage228

100nF 13. Jul 2008 13:41

Re: VST - IncrementalSearch -> Access violation
 
@ mkinzler
macht leider keinen unterschied zu meinem code, also die suche funktioniert zwar, aber bei zwei selben buchstaben nacheinander kommt immernoch der selbe fehler.

@ mirage228
naja beides ist möglich^^
Mehr kann ich da auch nicht sagen (warum, wiso...) da ich zu wenig ahnung von der materie habe...

EDIT: ja, NodeDataSize hab ich im oncreate definiert.

mkinzler 13. Jul 2008 13:42

Re: VST - IncrementalSearch -> Access violation
 
Hast du die dahinterliegenden Instanzen erzeugt?

100nF 13. Jul 2008 13:53

Re: VST - IncrementalSearch -> Access violation
 
ööhm was meinst du damit genau?

also das komische ist ja, dass es funktioniert!!!
nur wenn ich 2 mal kurz hintereinander den selben buchstaben tippe, NUR dann kommt der fehler!
deshalb habe ich das gefühl dass es weniger am TArchiv oder was auch immer liegt, sondern halt an etwas anderem, aber kA an was...

semo 13. Jul 2008 13:54

Re: VST - IncrementalSearch -> Access violation
 
ich würde immer erst prüfen ob der NodeData record assigned ist bevor ich mit diesem arbeite:

Delphi-Quellcode:
procedure TForm1.VST1IncrementalSearch(Sender: TBaseVirtualTree;
  Node: PVirtualNode; const SearchText: WideString; var Result: Integer);
var
  s1, s2: string;
  Archiv: TArchiv;
  NodeData: PNodeData;
begin
  NodeData := vst1.getnodedata(node);
  if Assigned(NodeData) then
  begin
    Archiv := TArchiv(vst1.getnodedata(node)^);
    ...
  end;
end;
Ich frage mich auch wo du den Typ PNodeData (oder ähnlich) deklarierst?
Die Daten des Knoten sind meines Wissens nach immer ein Pointer auf einen Record.
In diesem Record kannst du dann wenn unbedingt nötig dein TArchiv verwalten.

Schau dir am besten einmal die Demos zum VirtualStringTree an, diese sind auf der Downloadseite verfügbar.

mkinzler 13. Jul 2008 13:57

Re: VST - IncrementalSearch -> Access violation
 
Kann auch ein Zeiger auf eine Insatnz sein, nur muss man dann die Instanzierung selber durchführen, und kann nicht einfach durch eine Cast auf den Speicherbereich zugreifen

Assertor 13. Jul 2008 13:59

Re: VST - IncrementalSearch -> Access violation
 
Hi,

nur kurz aus dem Kopf: Du solltest innerhalb Deiner Routine besser prüfen, ob Node zugewiesen ist per
Delphi-Quellcode:
if Assigned(Node)
.

Gruß Assertor

@Hassmann/Kinzler: Roter Kasten. Ihr seid zu schnell für einen Sonntag ;)

SirThornberry 13. Jul 2008 14:01

Re: VST - IncrementalSearch -> Access violation
 
Zitat:

...gibts eine "access violation".
Könntest du bitte die genaue Fehlermeldung posten? Insbesondere die Adressen die bei der Zugriffsverletzung angezeigt werden würden sehr weiter helfen. Dann wäre es auch nicht so ein Rätzel raten :-)

semo 13. Jul 2008 14:02

Re: VST - IncrementalSearch -> Access violation
 
Entweder stellst du weitere Infos zur Verfügung, wie SirThornberry zum Beispiel gerade angemerkt hat oder
ich hätte gern einmal die Sourcen des Projekts oder zumindest dein Hauptformular verfügbar um sich das mal näher anzusehen. Hängst du das an?

100nF 13. Jul 2008 14:16

Re: VST - IncrementalSearch -> Access violation
 
jeah danke leute es funktioniert!! :firejump: :firejump:

Habe das "if assigned(node)..." eingefügt, jetzt gehts wunderbar!

Vielen Dank! :angel:

semo 13. Jul 2008 16:09

Re: VST - IncrementalSearch -> Access violation
 
ob das wirklich die ultimativlösung ist bleibt fraglich,
denn eigentlich sollte doch der node an dieser stelle immer assigned sein?!

Assertor 13. Jul 2008 16:27

Re: VST - IncrementalSearch -> Access violation
 
Zitat:

Zitat von M. Hassmann
ob das wirklich die ultimativlösung ist bleibt fraglich,
denn eigentlich sollte doch der node an dieser stelle immer assigned sein?!

Das ist schon vollkommen in Ordnung. Sieh dir mal die Tutorials und Demos von Michael und Jim an. Dort wird imho in jeder Funktion auf Assigned geprüft.

Liegt eher am Design des VST, da hier ein anderer Schwerpunkt als bei den "üblichen" Klassen in Delphi liegt.

Gruß Assertor


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