Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Recordtyp erforderlich, oder wo liegt mein Fehler (https://www.delphipraxis.net/47208-recordtyp-erforderlich-oder-wo-liegt-mein-fehler.html)

schöni 7. Jun 2005 21:23


Recordtyp erforderlich, oder wo liegt mein Fehler
 
Hallo Delphi Experten!

Die folgende Unit soll im Rahmen eines Freeware-IDE-Projektes einen Dialog bereitstellen, der eine Eingabezeile enthält, in die ich bei Exception oder Laufzeitfehler die Fehleradresse eingebe und den Compiler/Debugger anschließend danach suchen lasse.

Der Dialog soll mehrsprachig ausgelegt werden. Das löse ich auf die folgende Weise. Aktuell sind nur die beiden Sprachen Deutsch und Englisch definiert. Da das ganze eh Open Source werden soll, reichen diese beiden Sprachen auch vorerst. Zunächst soll die Funktionalität realisiert werden.

Mein Problem:

In Zeile 86 -> btnOk.Caption ... geht es nicht weiter.

Ich definiere für jede Sprache Konstanten, die ich einem Record FCaptions zuweise, der im Formular (siehe unten) definiert ist. Ob die deutschen oder die englischen Konstanten zugewiesen werden, hängt von einem Integerwert ab:

0: Englisch
1: Deutsch
2: ...

In der Unit mit dem Hauptformular des Projektes definiere ich zudem folgendes:

Delphi-Quellcode:
type
  TApplicationLanguage = (
    app_lang_english,
    app_lang_german     //Hier sollen später weitere Sprachen folgen
  );

const
  app_lang_eng = 0;
  app_lang_ger = 1;
In der EdUnit, die das Formular der IDE enthält, steht dann folgendes:

Delphi-Quellcode:
procedure TpedForm.Laufzeitfehler1Click(Sender: TObject);
begin
   RunTimeErrorDlg := TRunTimeErrorDlg.Create(self);
   RuntimeErrorDlg.Language := Integer(app_lang_german); // oder ... := app_lang_ger;
   RunTimeErrorDlg.ShowModal;
   if RunTimeErrorDlg.ModalResult = mrOk then
   begin
     // Hierhin kommt dann die Suchroutine
   end;
end;
So, deshalb also der ganze Aufwand.

Nun zu der Unit, die den Fehler enthält:

Delphi-Quellcode:
unit ExceptnDlg;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

const
  Title_eng    = 'exception / run time error';
  ErrAdr_eng   = 'Error-addr:';
  btnOk_eng    = '&Search...';
  btnCancel_eng = 'Cancel';
  btnHelp_eng  = 'Help';
  cbxDbg_eng   = 'Enable debugger';

  Title_ger    = 'Exception / Laufzeitfehler...';
  ErrAdr_ger   = 'Fehleradresse:';
  btnOk_ger    = '&Suchen...';
  btnCancel_ger = 'A$bbrechen';
  btnHelp_ger  = '$Hilfe';
  cbxDbg_ger   = 'Debugger aktivieren';


type
  TRuntimeErrorDlgCaptions = record
    Title: String;
    ErrAdr: String;
    btnOk: String;
    btnCancel: String;
    btnHelp: String;
    cbxDbg: String;
  end;

type
  TRuntimeErrorDlg = class(TForm)
    edErrorAdr: TEdit;
    lblErrAdr: TLabel;
    btnOk: TBitBtn;
    btnCancel: TBitBtn;
    btnHelp: TBitBtn;
    cbxDbg: TCheckBox;
  private
    { Private-Deklarationen }
    FCaptions: TRuntimeErrorDlgCaptions;
    FLanguage: Integer;
    procedure SetLanguage(value: Integer);
  public
    { Public-Deklarationen }
    property Language: Integer read FLanguage write SetLanguage;
  end;

var
  RuntimeErrorDlg: TRuntimeErrorDlg;

implementation

{$R *.DFM}

procedure TRuntimeErrorDlg.SetLanguage(value: Integer);
begin
   case Language of
     0: { english }
     with FCaptions do begin
       Title    := Title_eng;
       ErrAdr   := ErrAdr_eng;
       btnOk    := btnOk_eng;
       btnCancel := btnCancel_eng;
       btnHelp  := btnHelp_eng;
       cbxDbg   := cbxDbg_eng;
     end;
     1: { german }
     with FCaptions do begin
       Title    := Title_ger;
       ErrAdr   := ErrAdr_ger;
       btnOk    := btnOk_ger;
       btnCancel := btnCancel_ger;
       btnHelp  := btnHelp_ger;
       cbxDbg   := cbxDbg_ger;
     end;
   end;
   with FCaptions do
   begin
      Caption          := Title;
      lblErrAdr.Caption := ErrAdr;
      btnOk.Caption    := FCaptions.btnOk; //An dieser Zeile scheitert Delphi
      btnCancel.Caption := btnCancel;       //             "
      btnHelp.Caption  := btnHelp;         //             "
      cbxDbg.Caption   := cbxDbg;          //             "
   end;
end;

end.

Bin ich denn blind? Wo liegt der Fehler? Ich kann nix falsches entdecken.

Wer kann helfen. Vier Augen sehen ja vielleicht mehr als meine zwei alleine.

schöni

DP-Maintenance 7. Jun 2005 21:29

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Fragen / Anregungen zur DP" nach "Object-Pascal / Delphi-Language" verschoben.
Ist keine Frage zur DP

marabu 8. Jun 2005 06:21

Re: Recordtyp erforderlich, oder wo liegt mein Fehler
 
Hallo schöni,

Delphi-Quellcode:
with FCaptions do begin
  btnOk.Caption    := FCaptions.btnOk; // An dieser Zeile scheitert Delphi
  ...
end;
der Compiler macht aus deinem with Block das hier:

Delphi-Quellcode:
FCaptions.btnOK.Caption := FCaptions.btnOK;
Also ich weiss schon was du da machen willst, aber durch die Namensüberdeckung im with-block verlierst du etwas den Überblick. Der Compiler würde dich so eher verstehen:

Delphi-Quellcode:
btnOk.Caption := FCaptions.btnOk;
Vielleicht solltest du deine Caption nicht btnOK sondern captionOK nennen...

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz