AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FDConnection.GetCatalognames wirft AV

Ein Thema von Delbor · begonnen am 9. Mär 2017 · letzter Beitrag vom 10. Mär 2017
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

FDConnection.GetCatalognames wirft AV

  Alt 9. Mär 2017, 21:40
Delphi-Version: XE8
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
Miniaturansicht angehängter Grafiken
struktur1.jpg   struktur2.jpg   struktur3.jpg  
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.019 Beiträge
 
Delphi 12 Athens
 
#2

AW: FDConnection.GetCatalognames wirft AV

  Alt 9. Mär 2017, 22:06
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: FDConnection.GetCatalognames wirft AV

  Alt 9. Mär 2017, 22:49
Hi Uwe Raabe
Ja. FDMySQLDml ist das Datenmodul. Und TMySQLCorrespondent ist da deklariert (vor FDMySQLDml) und ein privates Feld des Datenmoduls.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.019 Beiträge
 
Delphi 12 Athens
 
#4

AW: FDConnection.GetCatalognames wirft AV

  Alt 9. Mär 2017, 23:32
Du übergibst ja als Rückgabewert in GetCatalogInformation die aktuelle FCatNames-Instanz. Der Rückgabewert wird aber nicht irgendwo freigegeben, oder?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: FDConnection.GetCatalognames wirft AV

  Alt 9. Mär 2017, 23:51
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (10. Mär 2017 um 01:13 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: FDConnection.GetCatalognames wirft AV

  Alt 10. Mär 2017, 06:44
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#7

AW: FDConnection.GetCatalognames wirft AV

  Alt 10. Mär 2017, 07:02
Moin...
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.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: FDConnection.GetCatalognames wirft AV

  Alt 10. Mär 2017, 08:26
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#9

AW: FDConnection.GetCatalognames wirft AV

  Alt 10. Mär 2017, 08:53
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?

Geändert von haentschman (10. Mär 2017 um 09:47 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: FDConnection.GetCatalognames wirft AV

  Alt 10. Mär 2017, 10:08
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 ä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...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (10. Mär 2017 um 11:00 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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