Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ClientDataSet.CreateDataSet + Exception (https://www.delphipraxis.net/193008-clientdataset-createdataset-exception.html)

H.Bothur 9. Jun 2017 16:42

Datenbank: Keine • Version: keine • Zugriff über: keine

ClientDataSet.CreateDataSet + Exception
 
Moin,

weas mache ich denn jetzt wieder falsch ?? Ich will den Dataset dann aus einem CSV befüllen.

Delphi-Quellcode:
  Mahn.ClientDataSet.Active := False;
  Mahn.ClientDataSet.FieldDefs.Clear;
  Mahn.ClientDataSet.FieldDefs.Add('KundenNummer', ftString, 5);
  Mahn.ClientDataSet.FieldDefs.Add('KundeKurz', ftString, 30);
  Mahn.ClientDataSet.FieldDefs.Add('RechnungNr', ftString, 10);
  Mahn.ClientDataSet.FieldDefs.Add('RechnungsDatum', ftString, 10);
  Mahn.ClientDataSet.CreateDataSet;
  Mahn.ClientDataSet.Active := True;
Sobald es zum ClientDataSet.CreateDateSet kommt gibt es eine Exception:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Mahnung.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x00685687: read of address 0x00000000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Gruß
Hans

himitsu 9. Jun 2017 18:14

AW: ClientDataSet.CreateDataSet + Exception
 
Welche Codezeile ist denn $00685687 ?

Ich hoffe dieser Code liegt nicht in einer Methode einer Form/DataModul, welches sich TMahn schimpft.
Und ohne weitere Informationen ist dieser einsame Codeschnipsel jedenfalls funktionsfähig.


PS: Dankt dem gekauften AnyDAC wäre TFDMemTable die bessere Komponente, in aktuelleren Delphis.

H.Bothur 9. Jun 2017 19:45

AW: ClientDataSet.CreateDataSet + Exception
 
Zitat:

Zitat von himitsu (Beitrag 1374075)
Welche Codezeile ist denn $00685687 ?

Im Sourcecode ist die Zeile

Delphi-Quellcode:
  Mahn.ClientDataSet_OPListe.Active := True;
markiert. Und - wenn es helfen sollte - im Aufrufstack steht ein hellblauer Pfeil vor 00685687 TCustomClientDataSet.InternalCheck

Zitat:

Ich hoffe dieser Code liegt nicht in einer Methode einer Form/DataModul, welches sich TMahn schimpft.
Und ohne weitere Informationen ist dieser einsame Codeschnipsel jedenfalls funktionsfähig.
Doch - weil wenn ich das nicht schreibe sondern nur

Delphi-Quellcode:
  ClientDataSet_OPListe.Active := False;
  ClientDataSet_OPListe.FieldDefs.Clear;
  ClientDataSet_OPListe.FieldDefs.Add('KundenNummer', ftString, 5);
dann bekomme ich beim compilieren schon eine Fehlermeldung:

E2003: undeklarierter Bezeichner: 'ClientDataSet_OPListe


Zitat:

PS: Dankt dem gekauften AnyDAC wäre TFDMemTable die bessere Komponente, in aktuelleren Delphis.
OK - Kuck ich mal !

Gruss
Hans

himitsu 9. Jun 2017 20:21

AW: ClientDataSet.CreateDataSet + Exception
 
Zitat:

Zitat von H.Bothur (Beitrag 1374093)
Doch - weil wenn ich das nicht schreibe sondern nur ...

Jetzt rate mal, was wäre, wenn man die paar Codezeilen drumrum auch mit zeigen würde. :roll:

Ich rate einfach mal und wette mit dir um 300$, dass Mahn oder Mahn.ClientDataSet_OPListe nil ist,
aber das hätte dir der Debugger auch sofort kostenlos sagen können, wenn man ihn nutzen täte.


Auch wenn die andere Komponente etwas besser ist, behebt sie nicht "dieses" Problemchen.
Ob ich nun mit 'ner Ente oder einem Ferrari gegen 'ne Wand fahre ... kaputt gehn Beide.
Nur bei 'ner Blondine geht die Wand kaputt ... der Klügere gibt halt nach. :oops:

H.Bothur 9. Jun 2017 20:32

AW: ClientDataSet.CreateDataSet + Exception
 
Moin,

kein Thema ....

Delphi-Quellcode:
unit MahnUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
  Datasnap.DBClient, Vcl.StdCtrls, IniFiles, Vcl.ExtCtrls, Printers;

type
  TMahn = class(TForm)
    BtnDrucken: TButton;
    BtnAdresse: TButton;
    BtnMailTausch: TButton;
    DataSource_OpListe: TDataSource;
    DBGrid_OpListe: TDBGrid;
    LbEStatus: TLabeledEdit;
    CBDruckerAuswahl: TComboBox;
    PrintDialog1: TPrintDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure CBDruckerAuswahlChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Mahn: TMahn;

implementation
{$R *.dfm}

var
  ProgrammGestartet: Boolean;
  LetzteFrist: TDateTime;
  KundenDatei,
  OPDatei: String;

  MahnGebuehren1,
  MahnGebuehren2,
  MahnGebuehren3: Real;

  MailAbsender,
  MailPasswort,
  MailServer: String;
  MailPort: Integer;

  VertreterAdressenList,
  VertreterNummernList: TStringList;
  AktuelleZeile: Integer;

procedure IniDateiLesen;
var
  Ini: TIniFile;
  LetzteFristTage: Integer;
begin
  Ini:=TIniFile.Create(ExtractFilePath(ExpandFileName(ParamStr(0))) +'MahnProjekt.ini');
  try
    KundenDatei := Ini.ReadString('Allgemein', 'Kundendatei', '');
    OPDatei := Ini.ReadString('Allgemein', 'OPdatei', '');
    MailAbsender := Ini.ReadString('EMail-Versand', 'MailAbsender', '');
    MailPasswort := Ini.ReadString('EMail-Versand', 'MailPasswort', '');
    MailServer := Ini.ReadString('EMail-Versand', 'MailServer', '');
    MailPort := Ini.ReadInteger('EMail-Versand', 'MailPort', 0);
    MahnGebuehren1 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren1', 0);
    MahnGebuehren2 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren2', 0);
    MahnGebuehren3 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren3', 0);
    LetzteFristTage := Ini.ReadInteger('Mahngebuehren', 'Letztefrist', 10);
    Ini.ReadSection('ADAdressen', VertreterAdressenList);
    Ini.ReadSection('ADNummern', VertreterNummernList);
  finally
    Ini.Free;
  end;
  LetzteFrist := LetzteFrist +LetzteFristTage;
end;

procedure TabellenHeaderSetzen;
begin
  Mahn.ClientDataSet_OPListe.Active := False;
  Mahn.ClientDataSet_OPListe.FieldDefs.Clear;
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('KundenNummer', ftString, 5);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('KundeKurz', ftString, 30);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('RechnungNr', ftString, 10);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('RechnungsDatum', ftString, 10);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('FaelligDatum', ftString, 10);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Betrag', ftString, 10);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('FaelligTage', ftString, 4);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('MahnStufe', ftString, 1);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Mahnen', ftString, 1);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Firma1', ftString, 30);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Firma2', ftString, 30);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Strasse', ftString, 30);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Land', ftString, 2);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('PLZ', ftString, 5);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Ort', ftString, 30);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Telefax', ftString, 30);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Email', ftString, 90);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('Vertreter', ftString, 50);
  Mahn.ClientDataSet_OPListe.FieldDefs.Add('RnEmail', ftString, 90);
  Mahn.ClientDataSet_OPListe.CreateDataSet;
  Mahn.ClientDataSet_OPListe.Active := True;
end;

procedure ShowStatus(Meldung: String);
begin
  Mahn.LbEStatus.Text := Meldung;
  Mahn.LbEStatus.Refresh;
end;

procedure TMahn.FormCreate(Sender: TObject);
begin
  ProgrammGestartet := False;
  VertreterAdressenList := TStringList.Create;
  VertreterNummernList := TStringList.Create;
end;

procedure TMahn.CBDruckerAuswahlChange(Sender: TObject);
begin
  Printer.PrinterIndex := CBDruckerauswahl.ItemIndex;
end;

procedure TMahn.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  VertreterAdressenList.Free;
  VertreterNummernList.Free;
end;

procedure TMahn.FormShow(Sender: TObject);
begin
  if not ProgrammGestartet then
  begin
    ProgrammGestartet := True;
    IniDateiLesen;
    TabellenHeaderSetzen;
    ShowStatus('Verarbeitung');
    LetzteFrist := Now +7;
    CBDruckerAuswahl.items := Printer.printers;
    CBDruckerAuswahl.ItemIndex := Printer.PrinterIndex;
  end;

end;

end.
Gruss
Hans

haentschman 10. Jun 2017 07:07

AW: ClientDataSet.CreateDataSet + Exception
 
Moin...:P
Ich habe das mal umgeschrieben...:P
Ist der Fehler nun nicht mehr da? Ist auf der Form eine Komponente namens ClientDataSet_OPListe?

Korrekturen:
1. globale Variablen in private verlagert
2. prozeduren in private verlagert
3. ein wenig sortiert :wink:
Delphi-Quellcode:
unit MahnUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
  Datasnap.DBClient, Vcl.StdCtrls, IniFiles, Vcl.ExtCtrls, Printers;

type
  TMahn = class(TForm)
    BtnDrucken: TButton;
    BtnAdresse: TButton;
    BtnMailTausch: TButton;
    DataSource_OpListe: TDataSource;
    DBGrid_OpListe: TDBGrid;
    LbEStatus: TLabeledEdit;
    CBDruckerAuswahl: TComboBox;
    PrintDialog1: TPrintDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure CBDruckerAuswahlChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FProgrammGestartet: Boolean;
    FLetzteFrist: TDateTime;
    FKundenDatei: string;
    FOPDatei: string;
    FMahnGebuehren1: Real;
    FMahnGebuehren2: Real;
    FMahnGebuehren3: Real;
    FMailAbsender: string;
    FMailPasswort: string;
    FMailServer: string;
    FMailPort: Integer;
    FVertreterAdressenList: TStringList;
    FVertreterNummernList: TStringList;
    FAktuelleZeile: Integer;
    procedure IniDateiLesen;
    procedure TabellenHeaderSetzen;
    procedure ShowStatus(Meldung: string);
  public
    { Public-Deklarationen }
  end;

var
  Mahn: TMahn;

implementation
{$R *.dfm}

procedure TMahn.FormCreate(Sender: TObject);
begin
  FProgrammGestartet := False;
  FVertreterAdressenList := TStringList.Create;
  FVertreterNummernList := TStringList.Create;
end;

procedure TMahn.FormDestroy(Sender: TObject); // Create und Destroy gehören zusammen //! verlagert TMahn.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FVertreterAdressenList.Free;
  FVertreterNummernList.Free;
end;

procedure TMahn.IniDateiLesen;
var
  Ini: TIniFile;
  LetzteFristTage: Integer;
begin
  Ini := TIniFile.Create(ExtractFilePath(ExpandFileName(ParamStr(0))) + 'MahnProjekt.ini');
  try
    FKundenDatei := Ini.ReadString('Allgemein', 'Kundendatei', '');
    FOPDatei := Ini.ReadString('Allgemein', 'OPdatei', '');
    FMailAbsender := Ini.ReadString('EMail-Versand', 'MailAbsender', '');
    FMailPasswort := Ini.ReadString('EMail-Versand', 'MailPasswort', '');
    FMailServer := Ini.ReadString('EMail-Versand', 'MailServer', '');
    FMailPort := Ini.ReadInteger('EMail-Versand', 'MailPort', 0);
    FMahnGebuehren1 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren1', 0);
    FMahnGebuehren2 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren2', 0);
    FMahnGebuehren3 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren3', 0);
    FLetzteFristTage := Ini.ReadInteger('Mahngebuehren', 'Letztefrist', 10);
    Ini.ReadSection('ADAdressen', FVertreterAdressenList);
    Ini.ReadSection('ADNummern', FVertreterNummernList);
  finally
    Ini.Free;
  end;
  FLetzteFrist := FLetzteFrist + LetzteFristTage;
end;

procedure TMahn.TabellenHeaderSetzen;
begin
  ClientDataSet_OPListe.Active := False;
  ClientDataSet_OPListe.FieldDefs.Clear;
  ClientDataSet_OPListe.FieldDefs.Add('KundenNummer', ftString, 5);
  ClientDataSet_OPListe.FieldDefs.Add('KundeKurz', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('RechnungNr', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('RechnungsDatum', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('FaelligDatum', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('Betrag', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('FaelligTage', ftString, 4);
  ClientDataSet_OPListe.FieldDefs.Add('MahnStufe', ftString, 1);
  ClientDataSet_OPListe.FieldDefs.Add('Mahnen', ftString, 1);
  ClientDataSet_OPListe.FieldDefs.Add('Firma1', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Firma2', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Strasse', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Land', ftString, 2);
  ClientDataSet_OPListe.FieldDefs.Add('PLZ', ftString, 5);
  ClientDataSet_OPListe.FieldDefs.Add('Ort', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Telefax', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Email', ftString, 90);
  ClientDataSet_OPListe.FieldDefs.Add('Vertreter', ftString, 50);
  ClientDataSet_OPListe.FieldDefs.Add('RnEmail', ftString, 90);
  ClientDataSet_OPListe.CreateDataSet;
  ClientDataSet_OPListe.Active := True;
end;

procedure TMahn.ShowStatus(Meldung: string);
begin
  LbEStatus.Text := Meldung;
  LbEStatus.Refresh;
end;

procedure TMahn.FormShow(Sender: TObject);
begin
  if not FProgrammGestartet then
  begin
    FProgrammGestartet := True;
    IniDateiLesen;
    TabellenHeaderSetzen;
    ShowStatus('Verarbeitung');
    FLetzteFrist := Now + 7;
    CBDruckerAuswahl.items := Printer.printers;
    CBDruckerAuswahl.ItemIndex := Printer.PrinterIndex;
  end;
end;

procedure TMahn.CBDruckerAuswahlChange(Sender: TObject);
begin
  Printer.PrinterIndex := CBDruckerauswahl.ItemIndex;
end;

end.
Unstimmigkeiten:
1. Wo arbeitest du mit dem DataSet? Ist das noch nicht implementiert?
2. LetzteFrist: Du liest erst die INI ein. Damit setzt du die LetzteFrist auf den INI Wert (10). Danach setzt du
Delphi-Quellcode:
FLetzteFrist := Now + 7;
und überschreibst du den letzten Wert. :gruebel:
3. Status "Verarbeitung" wird nicht zurückgesetzt? Soll das so sein?

H.Bothur 10. Jun 2017 11:04

AW: ClientDataSet.CreateDataSet + Exception
 
Zitat:

Zitat von haentschman (Beitrag 1374132)
Moin...:P
Ich habe das mal umgeschrieben...:P

Moin haentschman,
vielen Dank für die ganze Mühe die Du dir gegeben hast !!

Zitat:

Zitat von haentschman (Beitrag 1374132)
Ist der Fehler nun nicht mehr da? Ist auf der Form eine Komponente namens ClientDataSet_OPListe?

Ja - die Komponente ist da - kann sein das ich da nen Namen gelöscht hatte - das Programm startet jetzt aber so wie Du es geschrieben hast. Nur .... es ist viel schlimmer ... es gab wieder einen Exception. Nur dann habe ich eben den kompletten Source auf meine Laptop kopiert ... und da gibt es KEINE Exception.

Ich werde also auf diesem Rechner hier erst einmal einen MemTest machen müssen und dann das RAD-Studio komplett neu installieren. Ein Glück das ich ab Mittwoch im Homeoffice bin und die Ruhe dazu habe :-(

Hans


Zitat:

Zitat von haentschman (Beitrag 1374132)
Korrekturen:
1. globale Variablen in private verlagert
2. prozeduren in private verlagert
3. ein wenig sortiert :wink:

Danke - so etwas weiß ich zwar (theoretisch), denke aber immer viel zu selten daran :-(
Zitat:

Zitat von haentschman (Beitrag 1374132)
Unstimmigkeiten:
1. Wo arbeitest du mit dem DataSet? Ist das noch nicht implementiert?

Nein - das Programm ist jetzt ganz neu - alles andere sollte jetzt kommen :-)

Zitat:

Zitat von haentschman (Beitrag 1374132)
2. LetzteFrist: Du liest erst die INI ein. Damit setzt du die LetzteFrist auf den INI Wert (10). Danach setzt du
Delphi-Quellcode:
FLetzteFrist := Now + 7;
und überschreibst du den letzten Wert. :gruebel:

LACH - stimmt, das hatte ich aus einer Vorgänderversion - EIGENTLICH sollte LetzteFrist einstellbar werden

Zitat:

Zitat von haentschman (Beitrag 1374132)
3. Status "Verarbeitung" wird nicht zurückgesetzt? Soll das so sein?

Nein - auch da kommt noch mehr - das ist ja auch nur die Anzeige auf der Oberfläche was gerade passiert - da kommt noch "Daten einlesen", "Drucken" usw.

Hans

P.S. Weil noch drei kleine Fehler drin waren (FLetzteFristTage fehlte, FormClose noch im Kopf) hier noch einmal der komplette Source - so ist er lauffähig.

Delphi-Quellcode:
unit MahnUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
  Datasnap.DBClient, Vcl.StdCtrls, IniFiles, Vcl.ExtCtrls, Printers;

type
  TMahn = class(TForm)
    BtnDrucken: TButton;
    BtnAdresse: TButton;
    BtnMailTausch: TButton;
    DataSource_OpListe: TDataSource;
    DBGrid_OpListe: TDBGrid;
    LbEStatus: TLabeledEdit;
    CBDruckerAuswahl: TComboBox;
    PrintDialog1: TPrintDialog;
    ClientDataSet_OpListe: TClientDataSet;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure CBDruckerAuswahlChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FProgrammGestartet: Boolean;
    FLetzteFrist: TDateTime;
    FKundenDatei: string;
    FOPDatei: string;
    FMahnGebuehren1: Real;
    FMahnGebuehren2: Real;
    FMahnGebuehren3: Real;
    FLetzteFristTage: Integer;
    FMailAbsender: string;
    FMailPasswort: string;
    FMailServer: string;
    FMailPort: Integer;
    FVertreterAdressenList: TStringList;
    FVertreterNummernList: TStringList;
    FAktuelleZeile: Integer;
    procedure IniDateiLesen;
    procedure TabellenHeaderSetzen;
    procedure ShowStatus(Meldung: string);
  public
    { Public-Deklarationen }
  end;

var
  Mahn: TMahn;

implementation
{$R *.dfm}

procedure TMahn.FormCreate(Sender: TObject);
begin
  FProgrammGestartet := False;
  FVertreterAdressenList := TStringList.Create;
  FVertreterNummernList := TStringList.Create;
end;

procedure TMahn.FormDestroy(Sender: TObject); // Create und Destroy gehören zusammen //! verlagert TMahn.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FVertreterAdressenList.Free;
  FVertreterNummernList.Free;
end;

procedure TMahn.IniDateiLesen;
var
  Ini: TIniFile;
  LetzteFristTage: Integer;
begin
  Ini := TIniFile.Create(ExtractFilePath(ExpandFileName(ParamStr(0))) + 'MahnProjekt.ini');
  try
    FKundenDatei := Ini.ReadString('Allgemein', 'Kundendatei', '');
    FOPDatei := Ini.ReadString('Allgemein', 'OPdatei', '');
    FMailAbsender := Ini.ReadString('EMail-Versand', 'MailAbsender', '');
    FMailPasswort := Ini.ReadString('EMail-Versand', 'MailPasswort', '');
    FMailServer := Ini.ReadString('EMail-Versand', 'MailServer', '');
    FMailPort := Ini.ReadInteger('EMail-Versand', 'MailPort', 0);
    FMahnGebuehren1 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren1', 0);
    FMahnGebuehren2 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren2', 0);
    FMahnGebuehren3 := Ini.ReadFloat('Mahngebuehren', 'Mahngebuehren3', 0);
    FLetzteFristTage := Ini.ReadInteger('Mahngebuehren', 'Letztefrist', 10);
    Ini.ReadSection('ADAdressen', FVertreterAdressenList);
    Ini.ReadSection('ADNummern', FVertreterNummernList);
  finally
    Ini.Free;
  end;
  FLetzteFrist := FLetzteFrist + LetzteFristTage;
end;

procedure TMahn.TabellenHeaderSetzen;
begin
  ClientDataSet_OPListe.Active := False;
  ClientDataSet_OPListe.FieldDefs.Clear;
  ClientDataSet_OPListe.FieldDefs.Add('KundenNummer', ftString, 5);
  ClientDataSet_OPListe.FieldDefs.Add('KundeKurz', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('RechnungNr', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('RechnungsDatum', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('FaelligDatum', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('Betrag', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('FaelligTage', ftString, 4);
  ClientDataSet_OPListe.FieldDefs.Add('MahnStufe', ftString, 1);
  ClientDataSet_OPListe.FieldDefs.Add('Mahnen', ftString, 1);
  ClientDataSet_OPListe.FieldDefs.Add('Firma1', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Firma2', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Strasse', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Land', ftString, 2);
  ClientDataSet_OPListe.FieldDefs.Add('PLZ', ftString, 5);
  ClientDataSet_OPListe.FieldDefs.Add('Ort', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Telefax', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Email', ftString, 90);
  ClientDataSet_OPListe.FieldDefs.Add('Vertreter', ftString, 50);
  ClientDataSet_OPListe.FieldDefs.Add('RnEmail', ftString, 90);
  ClientDataSet_OPListe.CreateDataSet;
  ClientDataSet_OPListe.Active := True;
end;

procedure TMahn.ShowStatus(Meldung: string);
begin
  LbEStatus.Text := Meldung;
  LbEStatus.Refresh;
end;

procedure TMahn.FormShow(Sender: TObject);
begin
  if not FProgrammGestartet then
  begin
    FProgrammGestartet := True;
    IniDateiLesen;
    TabellenHeaderSetzen;
    ShowStatus('Verarbeitung');
    FLetzteFrist := Now + 7;
    CBDruckerAuswahl.items := Printer.printers;
    CBDruckerAuswahl.ItemIndex := Printer.PrinterIndex;
  end;
end;

procedure TMahn.CBDruckerAuswahlChange(Sender: TObject);
begin
  Printer.PrinterIndex := CBDruckerauswahl.ItemIndex;
end;

end.

H.Bothur 10. Jun 2017 11:09

AW: ClientDataSet.CreateDataSet + Exception
 
Moin,

nur noch mal eine Nachfrage zum allgemeinen Verständnis. Meine Kenntnisse kommen ja eher aus der TP3.0-Zeit:

Zitat:

Zitat von haentschman (Beitrag 1374132)
Moin...:P

Delphi-Quellcode:
  private
    { Private-Deklarationen }
    FProgrammGestartet: Boolean;
    FLetzteFrist: TDateTime;
    FKundenDatei: string;
    FOPDatei: string;
    procedure IniDateiLesen;
    procedure TabellenHeaderSetzen;
    procedure ShowStatus(Meldung: string);
  public
    { Public-Deklarationen }
  end;

var
  Mahn: TMahn;

implementation
{$R *.dfm}

procedure TMahn.FormCreate(Sender: TObject);

verstehe ich das richtig das man ...

a) alle Proceduren und Functionen die man im Programm nutzt nochmal in den private-Kopf schreibt
b) alle Variablen die ich immer noch in den VAR-Teil nach der Implementation ebenso in den private-Kopf kommen ?

Hans

himitsu 10. Jun 2017 11:15

AW: ClientDataSet.CreateDataSet + Exception
 
Wir sind seit sehr vielen Jahren objektorientiert (OOP) und nicht mehr prozedual.

Alles, was mit der Klasse (dem Objekt) zu tun hat, gehört auch da rein.

private, wenn nur das Objekt damit zu tun hat,
protected, wenn auch Nachfahren damit was machen dürfen
und public wenn Andere darauf zugreifen dürfen.

"ohne" ist bei TComponent/TPersistent-Nachfahren wie published
und sonst public.

published ist wie public, nur mit Zusatzinfos, damit z.B. der DFM-Loader und der OI diese Daten interpretieren kann.

H.Bothur 10. Jun 2017 11:37

AW: ClientDataSet.CreateDataSet + Exception
 
Zitat:

Zitat von himitsu (Beitrag 1374144)
Wir sind seit sehr vielen Jahren objektorientiert (OOP) und nicht mehr prozedual.

Alles, was mit der Klasse (dem Objekt) zu tun hat, gehört auch da rein.

private, wenn nur das Objekt damit zu tun hat,
protected, wenn auch Nachfahren damit was machen dürfen
und public wenn Andere darauf zugreifen dürfen.

"ohne" ist bei TComponent/TPersistent-Nachfahren wie published
und sonst public.

published ist wie public, nur mit Zusatzinfos, damit z.B. der DFM-Loader und der OI diese Daten interpretieren kann.

Danke !!
Hans

haentschman 10. Jun 2017 12:45

AW: ClientDataSet.CreateDataSet + Exception
 
Hier das DocWiki dazu. http://docwiki.embarcadero.com/RADSt...jekte_(Delphi)
...siehe Sichtbarkeit von Klassenelementen (private/public etc.)

H.Bothur 10. Jun 2017 18:56

AW: ClientDataSet.CreateDataSet + Exception
 
Sorry für die blöde Nachfrage ... Konstanten packt man aber immer noch nach die implementation, oder ? Also ..

Delphi-Quellcode:
var
  MahnForm: TMahnForm;

implementation
{$R *.dfm}

uses DruckenUnit, ProtokollUnit, MailenUnit;

const
  CKundenNummer = 0;
  CKundeKurz = 1;
  CRechnungsNr= 2;
  CRechnungsDatum = 3;
Hans

himitsu 10. Jun 2017 19:10

AW: ClientDataSet.CreateDataSet + Exception
 
Das kommt drauf an.

Auch sowas kann man problemlos in eine Klasse packen.
Konstanten, andere "interne" Typen und globale Variablen sind alles möglich.

Delphi-Quellcode:
type
  TMyClass = class
  private type
    TSubClass = class
    end;
  private const
    cTheConst = 123;
  private class var
    FTheVar: Integer;
  end;
Dass ich die Sichtbarkeit (private) in die selbe Zeile schreibe und jeden Teil quasi als eigentständigr Section anlege, ist eine ganz persönliche Sache, die ich für mich beschlossen habe, für einen übersichtlicheren Code.

Delphi-Quellcode:
type
  TMyClass = class
  private
    FVariable: Integer;
    type
      TSubClass = class
      end;
    const
      cTheConst = 123;
    class var
      FTheGlobalVar: Integer;
    var
      FVariable2: Integer; // das Erste ist immer implizit, darum schreibt da niemand ein VAR hin, wenn er Felder (Variablen) in Klassen nutzt
    class procedure Methode;
    procedure KlassenMethode;
  public
    constructor Create;
  end;

H.Bothur 15. Jun 2017 14:59

AW: ClientDataSet.CreateDataSet + Exception
 
Sorry - aber ich muss auf das Thema der Exception noch einmal zurückkommen:

- Programm compiliert richtig
- Sobald es zum ClientDataSet.CreateDataSet kommt gibt es eine Exception
- Ich habe Delphi (10.1 Starter) jetzt dreimal de- und neu installiert, ändert sich leider nur nichts.
- Es kann nur etwas mit der Installation, nichts mit dem Memory zu tun haben (Festplatten in zweiten, baugleichen Rechner gepackt)
- Auf dem Laptop geht alles

Hat jemand noch eine Idee die NICHT eine komplette Neuinstallation von Windows bedeutet ??

Gruß
Hans

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Mahnung.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x00685913: read of address 0x00000000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Der Aufruf-Stack sieht so aus:

:00685913 TCustomClientDataSet.InternalCheck + $4F
:0068496e TCustomClientDataSet.CreateDSBase + $3E
MahnUnit.TMahn.TabellenHeaderSetzen
MahnUnit.TMahn.FormActivate($2DE2E60)
:005e2395 TCustomForm.Activate + $2D
:00535152 TWinControl.WndProc + $5EE
:005df962 TCustomForm.WndProc + $652

Delphi-Quellcode:
procedure TMahn.TabellenHeaderSetzen;
begin
  ClientDataSet_OPListe.Active := False;
  ClientDataSet_OPListe.FieldDefs.Clear;
  ClientDataSet_OPListe.FieldDefs.Add('KundenNummer', ftString, 5);
  ClientDataSet_OPListe.FieldDefs.Add('KundeKurz', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('RechnungNr', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('RechnungsDatum', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('FaelligDatum', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('Betrag', ftString, 10);
  ClientDataSet_OPListe.FieldDefs.Add('FaelligTage', ftString, 4);
  ClientDataSet_OPListe.FieldDefs.Add('MahnStufe', ftString, 1);
  ClientDataSet_OPListe.FieldDefs.Add('Mahnen', ftString, 1);
  ClientDataSet_OPListe.FieldDefs.Add('Firma1', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Firma2', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Strasse', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Land', ftString, 2);
  ClientDataSet_OPListe.FieldDefs.Add('PLZ', ftString, 5);
  ClientDataSet_OPListe.FieldDefs.Add('Ort', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Telefax', ftString, 30);
  ClientDataSet_OPListe.FieldDefs.Add('Email', ftString, 90);
  ClientDataSet_OPListe.FieldDefs.Add('Vertreter', ftString, 50);
  ClientDataSet_OPListe.FieldDefs.Add('RnEmail', ftString, 90);
  ClientDataSet_OPListe.CreateDataSet;
  ClientDataSet_OPListe.Active := True;
end;

TigerLilly 16. Jun 2017 09:26

AW: ClientDataSet.CreateDataSet + Exception
 
Es würde mich sehr wundern, wenn das was mit dem Setup von Delphi oder Windows zu tun hat.

Was hat denn das CDS an Eigenschaften gesetzt?
Du kannst auch die Debug-DCUs aktivieren im Einzelschrittmodus prüfen, wo die Exception genau auftritt.

H.Bothur 16. Jun 2017 09:54

AW: ClientDataSet.CreateDataSet + Exception
 
Zitat:

Zitat von TigerLilly (Beitrag 1374669)
Es würde mich sehr wundern, wenn das was mit dem Setup von Delphi oder Windows zu tun hat.

Was hat denn das CDS an Eigenschaften gesetzt?
Du kannst auch die Debug-DCUs aktivieren im Einzelschrittmodus prüfen, wo die Exception genau auftritt.

Moin,

wenn ich das debugge gibt es die Exception genau bei ClientDataSet.CreateDataSet
Und es muss was mit der Installation zu tun haben - denn wenn ich den gleichen Source auf dem Laptop laufen lasse dann funktioniert es.

Gruß
Hans

TigerLilly 16. Jun 2017 09:59

AW: ClientDataSet.CreateDataSet + Exception
 
Ja, aber zu der Methode gibt es in DBClient.pas ja auch Code + so würdest du sehen, an welcher Stelle das Problem auftritt.

Möglicherweise gibt es am Laptop andere Dateien oder Pfade oder Lese/Schreibrechte. Im schlimmsten Fall ist das Problem nach einer Neuinstallation weg, aber dann weißt du immer noch nicht, warum.

mikhal 16. Jun 2017 10:05

AW: ClientDataSet.CreateDataSet + Exception
 
Vielleicht liege ich ja jetzt ganz falsch:

Ich finde in deinem Quelltext lediglich DataSource_OpListe: TDataSource, aber kein ClientDataSet_OPListe: TClientDataSet. Liegt dieses ClientDataSet wirklich auf dem Form? Wenn ja, warum wird es nicht in deiner Klasse aufgeführt?

Grüße
Mikhal

PS: CreateDataSet legt einen leeren Datensatz an, dazu muss das ClientDataSet active sein oder mit Open geöffnet sein...

H.Bothur 16. Jun 2017 10:48

AW: ClientDataSet.CreateDataSet + Exception
 
Moin Mikhal,

Zitat:

Zitat von mikhal (Beitrag 1374676)
Ich finde in deinem Quelltext lediglich DataSource_OpListe: TDataSource, aber kein ClientDataSet_OPListe: TClientDataSet. Liegt dieses ClientDataSet wirklich auf dem Form? Wenn ja, warum wird es nicht in deiner Klasse aufgeführt?

Doch - den TClientDataSet gibt es und er ist auch entsprechend mit dem TDataSource verbunden.

Zitat:

PS: CreateDataSet legt einen leeren Datensatz an, dazu muss das ClientDataSet active sein oder mit Open geöffnet sein...
Das könnte es sein - wenn denn das ganze überhaupt nicht laufen würde - wie gesagt, auf dem Laptop läuft es ohne Probleme. :_(

Hans

mikhal 16. Jun 2017 11:47

AW: ClientDataSet.CreateDataSet + Exception
 
Tausch doch einfach mal die Reihenfolge der letzten beiden Zeilen deiner Routine, dann siehst du, ob das der Fehler ist.

Vergleiche mal diese letzten beiden Zeilen mit der Version auf dem Laptop...

Und nach wie vor vermisse ich das ClientDataSet in deiner Formularklasse TMahn. Da es sich ja kompilieren lässt, wird es wohl bei der Übertragung verschütt gegangen sein...

Grüße
Mikhal

H.Bothur 16. Jun 2017 13:52

AW: ClientDataSet.CreateDataSet + Exception
 
Hi Mikhal,

Zitat:

Zitat von mikhal (Beitrag 1374683)
Tausch doch einfach mal die Reihenfolge der letzten beiden Zeilen deiner Routine, dann siehst du, ob das der Fehler ist.

Wenn ich das mache .. also

Delphi-Quellcode:
  ClientDataSet_OPListe.Active := True;
  ClientDataSet_OPListe.CreateDataSet;
dann bekomme ich folgende Exception:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Mahnung.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'ClientDataSet_OpListe: Fehlender Daten-Provider oder Datenpaket' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------


Zitat:

Vergleiche mal diese letzten beiden Zeilen mit der Version auf dem Laptop...
Das muss ich nicht vergleichen - ich lade wirklich den gleichen Code das Verzeichnis für den Laptop ein Netzlaufwerk ist.

Zitat:

Und nach wie vor vermisse ich das ClientDataSet in deiner Formularklasse TMahn. Da es sich ja kompilieren lässt, wird es wohl bei der Übertragung verschütt gegangen sein...
Ist durchaus vorhanden :-)

Delphi-Quellcode:
type
  TMahn = class(TForm)
    Btn_Drucken: TButton;
    Btn_Adresse: TButton;
    Btn_MailTausch: TButton;
    DataSource_OpListe: TDataSource;
    DBGrid_OpListe: TDBGrid;
    ClientDataSet_OpListe: TClientDataSet;
    CBDruckerAuswahl: TComboBox;
    PrintDialog1: TPrintDialog;
Ich verstehe es einfach nicht - es KANN doch eigentlich nur an der Installation liegen, oder ??

Gruß
Hans

DeddyH 16. Jun 2017 13:56

AW: ClientDataSet.CreateDataSet + Exception
 
Nur so eine Idee: was passiert, wenn Du einmal MidasLib zu Deiner uses-Klausel hinzufügst?

H.Bothur 16. Jun 2017 18:10

AW: ClientDataSet.CreateDataSet + Exception
 
Moin DeddyH,

Zitat:

Zitat von DeddyH (Beitrag 1374693)
Nur so eine Idee: was passiert, wenn Du einmal MidasLib zu Deiner uses-Klausel hinzufügst?

MidasLLib wird auf beiden Rechnern nicht gefunden. Also auch nicht auf dem Laptop wo alles läuft.

Gruß
Hans

himitsu 16. Jun 2017 18:27

AW: ClientDataSet.CreateDataSet + Exception
 
MidasLib mit einem L?

http://www.delphipraxis.net/38450-midas-einbinden.html

H.Bothur 16. Jun 2017 20:53

AW: ClientDataSet.CreateDataSet + Exception
 
Moin Himitsu,

Zitat:

Zitat von himitsu (Beitrag 1374708)
MidasLib mit einem L?

Sorry - Tippfehler, ja mit einem L. Ich finde die Midas.Dll auch an folgenden Stellen im System

c:\Program Files (x86)\Embarcadero\Studio\18.0\bin\midas.dll
c:\Program Files (x86)\Embarcadero\Studio\18.0\Redist\win32\midas.d ll
c:\Windows\SysWOW64\midas.dll

Wobei auf dem Laptop - auf dem es ja läuft - die Version in c:\windows\SysWOW64 FEHLT. :-?

Gruß
Hans


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