Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Record als Funktionsrückgabe (https://www.delphipraxis.net/157988-record-als-funktionsrueckgabe.html)

fly_singapore 1. Feb 2011 13:54

Delphi-Version: 5

Record als Funktionsrückgabe
 
Hallo Allerseits,

Folgendes: Ich wollte eine Variabe vom Typ Record, welches ich mir slebst erstellt habe aus einer Funktion zurückgeben.

Zuerst habe ich das Record im Public-Bereich definiert:
Delphi-Quellcode:
type
      TRGW = record
      sAnzahl : string;
      sDS    : string;
      sMin   : string;
      sMax   : string;

  end;

danach Habe ich eine Funktion im Abschnitt <interface> deklariert:

Delphi-Quellcode:
 function new_calc(cLSZ: string) : TRGW;

dann die Funktion gebaut
Delphi-Quellcode:

function new_calc(cWert: string) : TRGW;

var

  rRecord : TRGW;

begin
    rRecord.iAnzahl = '3302';
    rRecord.sDS = '12';
    rRecord.sMin = '4';
    rRecord.sMax := '34';

new_calc := rRecord;
end;
Schon in der Funktionsdeklaration erkennt Delphi nicht das gerade
eben definierten Datentyp TRGW nicht mehr.. damit ist der weitere Programmablauf bei mir zum scheitern verurteilt.

Könnt ihr mir dabei helfen.. ?????

Danke schön

DeddyH 1. Feb 2011 14:01

AW: Record als Funktionsrückgabe
 
Steht denn die Typdeklaration im interface-Abschnitt oberhalb des Funktionsprototyps?

fly_singapore 1. Feb 2011 14:07

AW: Record als Funktionsrückgabe
 
Hallo DeddyH

ba klar:
Delphi-Quellcode:
...
 public
  cLSZ , cText, cWert, cRegion, cSQLString : String;
  iAG_Wert, iWert : Integer ;
  bResult : Boolean      ;

  type
      TRGW = record
      sAnzahl : integer;
      sDS    : integer;
      sMin   : integer;
      sMax   : integer;

  end;
    { Public-Deklarationen }

     end;

  function new_calc(cLSZ: string; oQuery: TADOQuery) : TRGW;

...
Der letzte Teil des Funktionsprototyps <TRGW> ist rot unterstrichen und der Parser sagt mir
"E2003 Undefinierter Bezeichner"

DeddyH 1. Feb 2011 14:09

AW: Record als Funktionsrückgabe
 
Das "public" und das "end" machen mich stutzig. Hast Du die Typdeklaration innerhalb einer Klassendeklaration stehen? Zumindest sieht das so aus.

fly_singapore 1. Feb 2011 14:18

AW: Record als Funktionsrückgabe
 
Nein, jedenfalls war es nicht beabsichtigt, innerhalb einer Klassendeklaration diesen Datentyp zu definieren..

im Grossen und Ganzen sieht der Unit-kopf so aus:
Delphi-Quellcode:
unit RLZ_prog;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, ADODB, Grids, DBGrids, ComCtrls, ExtCtrls,
  Menus, DBCtrls;



type
  TForm1 = class(TForm)
    Button1: TButton;
    Label2: TLabel;
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    ADOTable1: TADOTable;
    ADOQuery1: TADOQuery;
    DataSource2: TDataSource;
    DBGrid_Produkt: TDBGrid;
    ADO_Ref_Region: TADOTable;
    DataSource3: TDataSource;
    DBGrid_Region: TDBGrid;
    Label_Region: TLabel;
    Label_LSZ: TLabel;
    Edit_AG: TEdit;
    TrackBar_AG: TTrackBar;
    Panel1: TPanel;
    Label_Anzahl: TLabel;
    Label_DS: TLabel;
    Label_Min: TLabel;
    Label_Max: TLabel;
    Label_ergebnis_Anzahl: TLabel;
    Label_Ergebnis_Max: TLabel;
    Label_Ergebnis_DS: TLabel;
    Label_Ergebnis_Min: TLabel;
    Label_Erg_Anzahl: TLabel;
    Label_Erg_Region: TLabel;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Import1: TMenuItem;
    Berechnung1: TMenuItem;
    Beenden1: TMenuItem;
    Extrax1: TMenuItem;
    Datenbankeinbinden1: TMenuItem;
    N1: TMenuItem;
    Produktendern1: TMenuItem;
    ADOQuery2: TADOQuery;
    DataSource4: TDataSource;
    DBText_Anzahl: TDBText;
    procedure Button1Click(Sender: TObject);
    procedure DBGrid_RegionDblClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure TrackBar_AGChange(Sender: TObject);
    procedure ScrollBar_AbdeckungsgradChange(Sender: TObject);
    procedure DBGrid_ProduktDblClick(Sender: TObject);
    procedure DBGrid2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
 

  private
    { Private-Deklarationen }
  public
  cLSZ , cText, cWert, cRegion, cSQLString : String;
  iAG_Wert, iWert : Integer ;
  bResult : Boolean      ;

  type
      TRGW = record
      iAnzahl : integer;
      iDS    : integer;
      iMin   : integer;
      iMax   : integer;

  end;
    { Public-Deklarationen }

     end;

  function new_calc(cLSZ: string; oQuery: TADOQuery) : TRGW


var
  Form1: TForm1;

DeddyH 1. Feb 2011 14:22

AW: Record als Funktionsrückgabe
 
Wie ich schon vermutet hatte. Kleine Änderung:
Delphi-Quellcode:
unit RLZ_prog;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, ADODB, Grids, DBGrids, ComCtrls, ExtCtrls,
  Menus, DBCtrls;

type
  TForm1 = class(TForm)
    (* weggekürzt *)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    cLSZ , cText, cWert, cRegion, cSQLString : String;
    iAG_Wert, iWert : Integer ;
    bResult : Boolean      ;
  end; //Ende der Klassendeklaration

  TRGW = record
      iAnzahl : integer;
      iDS    : integer;
      iMin   : integer;
      iMax   : integer;
  end;


  function new_calc(cLSZ: string; oQuery: TADOQuery) : TRGW;


var
  Form1: TForm1;

fly_singapore 1. Feb 2011 14:42

AW: Record als Funktionsrückgabe
 
Hallo DeddyH,

vielen Dank für Deine Hilfe; ich habe es etwas zurechtgerückt. jetzt funktioniert es !!!

:-D:thumb:

Deep-Sea 1. Feb 2011 14:42

AW: Record als Funktionsrückgabe
 
Zitat:

Zitat von fly_singapore (Beitrag 1078830)
Delphi-Quellcode:
function new_calc(cWert: string) : TRGW;

var

  rRecord : TRGW;

begin
    rRecord.iAnzahl = '3302';
    rRecord.sDS = '12';
    rRecord.sMin = '4';
    rRecord.sMax := '34';

new_calc := rRecord;
end;

Bitte doch eher so:
Delphi-Quellcode:
function new_calc(cWert: string): TRGW;
begin
  Result.iAnzahl = '3302';
  Result.sDS = '12';
  Result.sMin = '4';
  Result.sMax := '34';
end;

himitsu 1. Feb 2011 14:46

AW: Record als Funktionsrückgabe
 
Zitat:

Zitat von DeddyH (Beitrag 1078844)
Wie ich schon vermutet hatte. Kleine Änderung:

Oder den richtigen Namespace angeben.
Delphi-Quellcode:
function new_calc(cLSZ: string; oQuery: TADOQuery) : TForm1.TRGW;
.

Warum man natürlich dennoch fragen könnte, warum diese Klasse in der Form liegt.


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