Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FDConnection.GetCatalognames wirft AV (https://www.delphipraxis.net/191981-fdconnection-getcatalognames-wirft-av.html)

Delbor 9. Mär 2017 21:40

Delphi-Version: XE8

FDConnection.GetCatalognames wirft AV
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hi zusammen

Ich habe meinem Datenmodul eine eigene Klasse zur 'direkten Kommunikation mit dem Server' spendiert. Im wesentlichen sollen damit Sessionvariablen abgerufen/verändert werden können.
Delphi-Quellcode:
  TMySQLCorrespondent = class(TPersistent)
    private{private Declarations}
      FContentmasterConnection : Boolean;
      FCatalogInformation: TStringlist;
      FMaxAllowedPacket: Integer;
    FCatNames: TStringList;
...
      function DefineContentmasterConnection: Boolean;
      function GetPerformanceSchemaConnection: Boolean;
      function GetSessionVarlist: TStringList;
      function GetCatalogInformation: TStringlist; //<==
    public{public Declarations}
      property ContentmasterConnection2: Boolean read DefineContentmasterConnection;
      property PerformanceSchemaConnection: Boolean read GetPerformanceSchemaConnection;
      property Cataloginformation : TStringlist read GetCatalogInformation;
...

    Constructor Create(AOwner: TObject);
    Destructor Destroy; override;
  end;
So die Deklaration. Einige der Felder und Propertys, die für diesen Thred nicht wichtig sind, habe ich durch Pünktchen ersetzt.
Das Thema ist das Feld FCatNames. Und so wird das verwendet:

Delphi-Quellcode:
constructor TMySQLCorrespondent.Create(AOwner: TObject);
begin
  inherited Create;
  FCatalogInformation := TStringlist.Create;
  FCatNames := TStringList.Create;
end;

destructor TMySQLCorrespondent.Destroy;
begin
  FCatalogInformation.Free;
  FCatNames.Free;
  inherited;
end;

function TMySQLCorrespondent.GetCatalogInformation: TStringlist;
  var i, j: Integer; Catalog: string;
begin
    FDMySQLDml.FDConnectionMySql.GetCatalogNames('', FCatNames);  // AV
    Result := FCatNames;
end;
Die AV wird ausgelöst, weil FCatnames unbekannnt ist, also nicht mal nil.
Was könnte da falsch sein?

Im Anhang noch 3 Jpegs meines Strukturfensters. Aktiv sind dabei:
Struktur1: TCM_First (das Hauptfenster)
Struktur2: TServerInfoFrame
Struktur3: FDMySQLDml (Datenmodul

Gruss
Delbor

Gruss
Delbor

Uwe Raabe 9. Mär 2017 22:06

AW: FDConnection.GetCatalognames wirft AV
 
Zitat:

Zitat von Delbor (Beitrag 1363684)
Die AV wird ausgelöst, weil FCatnames unbekannnt ist, also nicht mal nil.

Wenn es unbekannt wäre, gäbe es keine AV, sondern der Compiler hätte gemeckert. Eine AV kann nur zur Runtime kommen und da hat der Compiler schon alles abgenickt.

Ist FDMySQLDml zu dem Zeitpunkt eigentlich schon initialisiert?

Delbor 9. Mär 2017 22:49

AW: FDConnection.GetCatalognames wirft AV
 
Hi Uwe Raabe
Ja. FDMySQLDml ist das Datenmodul. Und TMySQLCorrespondent ist da deklariert (vor FDMySQLDml) und ein privates Feld des Datenmoduls.

Gruss
Delbor

Uwe Raabe 9. Mär 2017 23:32

AW: FDConnection.GetCatalognames wirft AV
 
Du übergibst ja als Rückgabewert in GetCatalogInformation die aktuelle FCatNames-Instanz. Der Rückgabewert wird aber nicht irgendwo freigegeben, oder?

Delbor 9. Mär 2017 23:51

AW: FDConnection.GetCatalognames wirft AV
 
Hi Uwe Raabe

Zitat:

Der Rückgabewert wird aber nicht irgendwo freigegeben, oder?
Nein.Vorgängig hatte ich mit einer lokalen Liste gearbeitet und sie auch lokal wieder freigegeben - und prompt keinen Rückgabewert erhalten. Daraufhin habe ich die Liste privat deklariert - so kann ich sie auch wieder korrekt freigeben.

Gruss
Delbor

PS: Der Aufruf:
Delphi-Quellcode:
procedure TServerInfoFrame.CatalogInformation;
  var i, j: Integer; Catalog, SQLString: string;
      LIndent : String; CatNames: TStringlist;
begin
  Self.LBxCatalogNames.Items.Insert(0,'procedure TServerInfoFrame.CatalogInformation;');
  Self.LBxCatalogNames.Items.Insert(1,'**********************************************');
  Catnames := TStringlist.Create;
  try
//    FDMySQLDml.FDConnectionMySql.GetCatalogNames('', CatNames);
    Self.LBxCatalogNames.Items.Add('Datenbank: ' + FDMySQLDml.FDConnectionMySql.Params.Database);
    Self.LBxCatalogNames.Items.AddStrings(FDMySQLDml.MySQLCorrespondent.Cataloginformation); //<< AV

Delbor 10. Mär 2017 06:44

AW: FDConnection.GetCatalognames wirft AV
 
Hi zusammen

Interessanterweise sind heute morgen die Fehlermeldungen in der Strukturansicht weg. Bin gespannt darauf, was es braucht, bis sie wieder da sind. Erwartet hätte ich, dass die Fehlermeldungen nach dem ersten Durchsteppen wieder da wären...

Am Fehler selbst hat sich nichts geändert. Entgegen meinem ersten Beitrag muss ich mich allerdings etwas korrigieren: Ich habe die Liste mal unter 'Überwachte Ausdrücke' eingetragen. Wenn nun beim durchsteppen die Unit des Datenmoduls aktiv wird, steht unter dem Eintrag der Liste "nicht verfügbarer Wert". Ist die Ausführungsposition bei Durchsteppen auf der entsprechenden Zeile und wenn ich die Maus über den Listenbezeichner halte, erhalte ich genau diese Meldung.


Gruss
Delbor

haentschman 10. Mär 2017 07:02

AW: FDConnection.GetCatalognames wirft AV
 
Moin...:P
Zitat:

Interessanterweise sind heute morgen die Fehlermeldungen in der Strukturansicht weg
...das liegt an der fehlerhaften Fehlermarkierung (Einstellungen). Ich weiß nicht warum die noch jemand benutzt. :gruebel:

Delbor 10. Mär 2017 08:26

AW: FDConnection.GetCatalognames wirft AV
 
Hi haentschman

Tatsächlich habe ich mich auch schon darüber geärgert. Wenn ich mich richtig erinnere, war das damals unter DXE4...
Das war auch schon nützlich. Wenn ich mich richtig erinnere, war dies unter DelphiXE - da wusste man: der Fehler steckt über der ersten unterstrichenen Quelltextzeile in genau der aktuellen Unit.

Gruss
Delbor

haentschman 10. Mär 2017 08:53

AW: FDConnection.GetCatalognames wirft AV
 
Zitat:

war dies unter DelphiXE - da wusste man
...war schon unter XE fehlerhaft. :?

Zitat:

FDMySQLDml ist das Datenmodul. Und TMySQLCorrespondent ist da deklariert (vor FDMySQLDml) und ein privates Feld des Datenmoduls.
...und erzeugst du die Instanz von TMySQLCorrespondent auch im constructor des Datenmoduls?

Delbor 10. Mär 2017 10:08

AW: FDConnection.GetCatalognames wirft AV
 
Hi haentschman
Upps...Ja! Aber als ich dasDing anlegte, war ich mir über die Namensgebung nicht ganz klar; der Bezeichner ist doch etwas lang. Wobei mir vor allem für den Teil"...korrespondet" nichts kürzeres und Aussagekräftiges einfiel. Ein Ausschnitt aus der Felddeklaration des Datenmoduls:
Delphi-Quellcode:
 
    FCategoryList: TDataObjectList<TQueryResultClass>;
    // Enthält die Bilder einer bestimmten Kategorie
    FCategoryBildList: TDataObjectList<TQueryResultClass>;
                  FMySQLCorrespondent : TMySQLCorrespondent;
    FWICImage: TWICImage;
    FContentmastertables: TStringlist;
    FPerformanceSchemaTables: TStringList;
    FSessionVarList : TStringlist;
    FServerKorrespontent: TMySQLCorrespondent;
    ...
...und aus der Property-Abteilung :P äh.. dem public-Abschnitt:

Delphi-Quellcode:
   
    property Contentmastertables: TStringlist read GetContentmasterTables;
    property PerformanceSchemaTables : TStringList read GetPerformanceSchemaTables;
    property SessionVarList: TStringList read GetSessionVarlist;
    property MySQLCorrespondent : TMySQLCorrespondent read FMySQLCorrespondent write FMySQLCorrespondent;
und zu guter(?)letzt aus dem Constructor des Datenmoduls:

Delphi-Quellcode:
 
procedure TFDMySQLDml.DataModuleCreate(Sender: TObject);
  var LIndent : String;
begin
  LIndent := '   -  ';
  FQueryResultList := TObjectList.Create;
  TPicture.RegisterFileFormat('NEF','NEF Format',TWICImage);
  FReportlist := TStringlist.Create;
  FSessionVarList := TStringlist.Create;
//  List := TObjectList<TNewObject>.Create();   TDataObjectList<TQueryResultClass>.
  FCategoryBildList := TDataObjectList<TQueryResultClass>.Create();
  FCategoryList := TDataObjectList<TQueryResultClass>.Create();
  FPathList := TStringList.Create;
  FServerKorrespontent := TMySQLCorrespondent.Create(Self);
  ...
OHH my god!!!

Gruss
Delbor

PS: Latürnich hab ich das gleich korrigiert und nicht FServerKorrespontent sondern FMySQLCorrespondent erstellt. Und da geschieht genau das, was Sir Rufo immer sagt: Kaum macht mans richtig...


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