Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komplexere Variante Records für Linie, Kreis und Rechteck (https://www.delphipraxis.net/22426-komplexere-variante-records-fuer-linie-kreis-und-rechteck.html)

Wasserratte 17. Mai 2004 17:36


Komplexere Variante Records für Linie, Kreis und Rechteck
 
Bonjour!

Unser Klassenlehrer hatte uns folgende Aufgabe gegeben:

Wir sollten eine Linie, einen Kreis und ein Rechteck Zeichnen und diese dann in einem komplexeren Variante Record speichern und wieder abrufen können, dabei sollten wir auch eine case Anweisung benutzen. Aus der Delpi-Hilfe wurde ich dann bei: "Variante Teile in Record-Typen" fündig, aber mir fehlt noch der Zugriff auf den Record, wer kann mir da helfen?

Delphi-Quellcode:
unit Unit1;

{

        Programmname           Variante_Records.exe
        Autor                  Christian S.
        Datei                  Variante_Records.dpr
        Dokumentation          --

        Datum                  2004-05-10
        Stand                  ok!
        Version                1.1.0
        Build                  001

        Modifis                2004-05-17 v1.1.0.1
                                1. Angefangen mit Variante Records.

        Last Mod               2004-05-17

}

interface

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

type
  TMain = class(TForm)
    Btn_Linie:         TButton;
    Btn_Rechteck:      TButton;
    Btn_Kreis:         TButton;
    Btn_Clear:         TButton;
    Splitter1:         TSplitter;
    L_X:               TLabel;
    Ed_X:              TEdit;
    L_Y:               TLabel;
    Ed_Y:              TEdit;
    L_X2:              TLabel;
    Ed_X2:             TEdit;
    L_Y2:              TLabel;
    Ed_Y2:             TEdit;
    Btn_Record:        TButton;
   
    procedure Btn_LinieClick(Sender: TObject);
    procedure Btn_KreisClick(Sender: TObject);
    procedure Btn_RechteckClick(Sender: TObject);
    procedure Btn_ClearClick(Sender: TObject);
    procedure Btn_RecordClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;

type
  TShapeList = (Linie, Kreis, Rechteck);
    TFigure = record
      case TShapeList of
        Linie   : ( X1, Y1, X2, Y2: Integer);              // Linie
        Kreis   : ( A1, B1, A2, B2: Integer);              // Kreis
        Rechteck : ( P1, Q1, P2, Q2: Integer);              // Rechteck
      end;

implementation

{$R *.dfm}

{------------------------------------------------------------------------------}

procedure TMain.Btn_LinieClick(Sender: TObject);
var
  X1, Y1, X2, Y2 : Integer;

begin
  X1 := strtoint( Ed_X.Text);
  Y1 := strtoint( Ed_Y.Text);
  X2 := strtoint( Ed_X2.Text);
  Y2 := strtoint( Ed_Y2.Text);
  Canvas.MoveTo( X1,Y1);
  Canvas.LineTo( X2,Y2);
end;

{------------------------------------------------------------------------------}

procedure TMain.Btn_KreisClick(Sender: TObject);
var
  A1, B1, A2, B2 : Integer;

begin
  A1 := strtoint( Ed_X.Text);
  B1 := strtoint( Ed_Y.Text);
  A2 := strtoint( Ed_X2.Text);
  B2 := strtoint( Ed_Y2.Text);
  Canvas.Brush.Style := bsClear;
  Canvas.Ellipse( A1, B1, A2, B2);
end;

{------------------------------------------------------------------------------}

procedure TMain.Btn_RechteckClick(Sender: TObject);
var
  P1, Q1, P2, Q2 : Integer;

begin
  P1 := strtoint( Ed_X.Text);
  Q1 := strtoint( Ed_Y.Text);
  P2 := strtoint( Ed_X2.Text);
  Q2 := strtoint( Ed_Y2.Text);
  Canvas.Brush.Style := bsClear;
  Canvas.Rectangle( P1, Q1, P2, Q2);
end;

{------------------------------------------------------------------------------}

procedure TMain.Btn_ClearClick(Sender: TObject);
begin
  Refresh;
end;

{------------------------------------------------------------------------------}

procedure TMain.Btn_RecordClick(Sender: TObject);
begin
  //
end;

end.
Gruss Chris

glkgereon 17. Mai 2004 18:01

Re: Komplexere Variante Records für Linie, Kreis und Rechtec
 
also, mit variants habbich noch nix gemacht, aber es sollte mich wundern wenn es andres wäre als bei normal

[Edit]Normal heisst für mich ein record "ohn" variant, also sowat
Delphi-Quellcode:
figur=record
   x1, x2, y1, y2:integer; end;
[/Edit]

bei normalen kommt einfach das:

Delphi-Quellcode:
typ.procedure;
und so

also einfach ein punkt dazwischen

also bei dir

Figur.x1
Figur.p2
usw

Wasserratte 17. Mai 2004 18:48

Re: Komplexere Variante Records für Linie, Kreis und Rechtec
 
NO SIR :!:

So was einfaches hatten wir schon letztes Jahr gemacht :witch:

glkgereon 17. Mai 2004 19:55

Re: Komplexere Variante Records für Linie, Kreis und Rechtec
 
äh, wie jetzt :gruebel:

aber es geht doch darum, wie man einen variant-record anspricht, oder?

weil das hab ich hier

http://www.delphipraxis.net/internal...variant+record

im 4. beitrag eindeutig gefunden (vorrausgesetzt natürlich, der qt funzt)

oder was meinst du genaumit "zugriff auf den record"?

Wasserratte 18. Mai 2004 18:13

Re: Komplexere Variante Records für Linie, Kreis und Rechtec
 
Vielen Dank glkbkk!

Aber irgendwie gehts immer noch nicht?
Der Variante Record soll jetzt noch zusätzlich mit einem Array laufen!
Wer hat ne Ahnung was in meinem Quelltext noch fehlt?

Delphi-Quellcode:
type
  TShapeList = (Linie, Kreis, Rechteck);
    TFigure = record
      case TShapeList of
        Linie   : ( X1, Y1, X2, Y2: Real);              // Linie
        Kreis   : ( A1, B1, A2, B2: Real);              // Kreis
        Rechteck : ( P1, Q1, P2, Q2: Real);              // Rechteck
      end;

implementation

{$R *.dfm}

var
  vr : TFigure;
  PListe : array [0..10] of TFigure;

{------------------------------------------------------------------------------}

procedure TMain.Btn_LinieClick(Sender: TObject);
var
  X1, Y1, X2, Y2 : Integer;

begin
  PListe[0].X1 := StrToInt( Ed_X.Text);
  PListe[0].Y1 := StrToInt( Ed_Y.Text);
  PListe[0].X2 := StrToInt( Ed_X2.Text);
  PListe[0].Y2 := StrToInt( Ed_Y2.Text);
  X1 := Round ( PListe[0].X1);
  Y1 := Round ( PListe[0].Y1);
  X2 := Round ( PListe[0].X2);
  Y2 := Round ( PListe[0].Y2);
  Canvas.MoveTo( X1, Y1);
  Canvas.LineTo( X2, Y2);
end;
Delphi-Quellcode:
procedure TMain.Btn_Record_LinieClick(Sender: TObject);
begin
  vr.X1 := StrToFloat(Ed_X.Text);
  vr.Y1 := StrToFloat(Ed_Y.Text);
  vr.X2 := StrToFloat(Ed_X2.Text);
  vr.Y2 := StrToFloat(Ed_Y2.Text);
end;
Ich werd mal in meiner dicken Schwarte nachschlagen :angle:

Wasserratte 24. Mai 2004 15:25

Re: Komplexere Variante Records für Linie, Kreis und Rechtec
 
Der Variante Record müsste so vollständig sein :drunken:
Delphi-Quellcode:
type
  TLinie = record
             X1, Y1,
             X2, Y2,
             Width : Integer;
           end;

  TFormList = (Linie, Kreis, Rechteck);
  TFigure = record
               Status : TFormList;
               case TFormList of
                 Linie   : ( TLinie        : Integer);          // Linie
                 Kreis   : ( Xm, Ym, Radius : Integer);          // Kreis
                 Rechteck : ( P1, Q1, P2, Q2 : Integer);          // Rechteck
               end;

implementation

{$R *.dfm}

var
  Zeichnungsdaten : array [0..10] of TFigure;
  F1, F2, F3, F4 : TFigure;
Ist meine Procedure auch richtig? Da muss noch was fehlen :gruebel:

Delphi-Quellcode:
procedure TMain.Btn_LinieClick(Sender: TObject);
var
  X1, Y1, X2, Y2 : Integer;

begin
  Btn_Linie.Enabled := False;
  with Zeichnungsdaten[0] do
    case Status of

    Linie :   begin
                 F1.TLinie := 22;
               end;

    Kreis :   begin
                 F1.Xm    := 10;
                 F2.Ym    := 20;
                 F3.Radius := 30;
               end;

    Rechteck : begin
                 F1.P1  := 20;
                 F2.Q1  := 30;
                 F3.P2  := 40;
                 F4.Q2  := 50;
               end;
  end;
  Btn_Linie.Enabled := true;
end;
  X1 := StrToInt( SpEd_X1.Text);
  Y1 := StrToInt( SpEd_Y1.Text);
  X2 := StrToInt( SpEd_X2.Text);
  Y2 := StrToInt( SpEd_Y2.Text);

  with Main.Image.Canvas do
    begin
      MoveTo( X1, Y1);
      LineTo( X2, Y2);
    end;
:angle2:


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