Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.546 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Komplizierte StringGrid-Frage

  Alt 3. Mär 2010, 12:34
Ich hatte eigentlich von einer Klasse gesprochen und nicht von einem Record. Im Moment habe ich keine Zeit, ein Beispiel zu schreiben, aber nach 14:30 kann ich das gern einmal tun.

[edit] So, hier nun ein Beispiel, wie ich mir das so gedacht hatte (ein Formular mit 3 Edits und 3 CheckBoxen):
Delphi-Quellcode:
unit Unit1;

interface

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

type
  //Forward-Deklaration der Containerklasse
  TMyContainer = class;

  //Ableitung von der Standard-Checkbox mit zusätzlicher Property
  TCheckBox = class(StdCtrls.TCheckBox)
  private
    FContainer: TMyContainer;
  public
    property Container: TMyContainer read FContainer write FContainer;
  end;

  //Ableitung vom Standard-Edit mit zusätzlicher Property
  TEdit = class(StdCtrls.TEdit)
  private
    FContainer: TMyContainer;
  public
    property Container: TMyContainer read FContainer write FContainer;
  end;

  //eigene Container-Klasse mit einer Checkbox, einem Edit sowie Demo-Zusatzdaten
  TMyContainer = class
  private
    FCheckbox: TCheckbox;
    FEdit: TEdit;
    FIntFeld: integer;
    procedure CheckBoxClick(Sender: TObject);
  public
    constructor Create(aCheckbox: TCheckbox;aEdit: TEdit);
    property Checkbox: TCheckBox read FCheckBox;
    property Edit: TEdit read FEdit;
    property IntFeld: integer read FIntFeld write FIntFeld;
  end;

  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    CheckBox2: TCheckBox;
    Edit2: TEdit;
    CheckBox3: TCheckBox;
    Edit3: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FArray: array of TMyContainer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyContainer }

constructor TMyContainer.Create(aCheckbox: TCheckbox; aEdit: TEdit);
begin
  inherited Create;
  //Referenzen wechselseitig zuweisen
  FCheckBox := aCheckBox;
  FEdit := aEdit;
  if Assigned(FCheckBox) then
    begin
      FCheckBox.Container := self;
      FCheckBox.OnClick := CheckBoxClick;
    end;
  if Assigned(FEdit) then
    FEdit.Container := self;
end;

procedure TMyContainer.CheckBoxClick(Sender: TObject);
const Choices: array[Boolean] of String = ('ist nicht gechecked','ist gechecked');
var Edit: TEdit;
begin
  //zur Demonstration aus der Checkbox auf das zugehörige Edit zugreifen
  if Sender is TCheckBox then
    if Assigned(TCheckBox(Sender).Container) then
      begin
        Edit := TCheckBox(Sender).Container.Edit;
        if Assigned(Edit) then
          Edit.Text := Format('%s (%d) %s.',[TCheckBox(Sender).Name,
                                             TCheckBox(Sender).Container.IntFeld,
                                             Choices[TCheckBox(Sender).Checked]]);
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  SetLength(FArray,3);
  FArray[0] := TMyContainer.Create(CheckBox1, Edit1);
  FArray[0].IntFeld := Random(100);
  FArray[1] := TMyContainer.Create(CheckBox2, Edit2);
  FArray[1].IntFeld := Random(100);
  FArray[2] := TMyContainer.Create(CheckBox3, Edit3);
  FArray[2].IntFeld := Random(100);
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i: integer;
begin
  for i := High(FArray) downto Low(FArray) do
    FArray[i].Free;
  //hatte ich vergessen
  SetLength(FArray,0);
end;

end.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat