2016-04-19 6 views
0

Also, ich versuche, eine Komponente, die den Job beim Einstellen der Einstellungen einer Excel, libreoffice, etc ... Zellen machen wird. Zuerst wollte ich nur den Wert einstellen, aber jetzt muss ich die Hintergrundfarbe der Zelle ändern, den Namen der Schriftart ändern, einen Stil festlegen, eine Formel setzen usw. ... Also entschied ich mich für einen Typ, der alle enthält Dinge, die ich will und so ändern, ich habe dies:Benutzerdefinierte Eigenschaft nur Trigger lesen Anweisung

type 
    TMyCell = class 
private 
    FBgColor: TColor; 
    FValue: String; 
    FFormula: String; 
    FFormat: String; 
    FFont: TFont; 

public 
    constructor Create; 
    destructor Destroy; 

    property Value: String read FValue write FValue; 
    property Formula: String read FFormula write FFormula; 
    property Format: String read FFormat write FFormat; 
    property BgColor: TColor read FBgColor write FBgColor; 
    property Font: TFont read FFont write FFont; 

end; 

{ TMyCell } 

constructor TMyCell.Create; 
begin 
    FFont := TFont.Create; 
end; 

destructor TMyCell.Destroy; 
begin 
    FFont.Free; 
end; 

und meine Komponente sieht wie folgt aus:

type 
    TMyPlan = class(TComponent) 
private 
    FExcel: Variant; 
    procedure SetMyCell(Row, Column: Integer; Value: TMyCell); 
    function GetMyCell(Row, Column: Integer): TMyCell; 

public 
    constructor Create(AOwner: TComponent); 
    destructor Destroy; 

    property Cell[Row, Column: Integer]: TMyCell read GetMyCell write SetMyCell; 
end; 

{ TMyPlan } 

constructor TMyPlan.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    FExcel := CreateOleObject('Excel.Application'); 
    FExcel.Workbooks.Add(1); 
end; 

destructor TMyPlan.Destroy; 
begin 
    FExcel := Unassigned; 
    inherited; 
end; 

function TMyPlan.GetMyCell(Row, Column: Integer): TMyCell; 
begin 
    Result := TMyCell.Create; 
    Result.Value := FExcel.Cells[Row, Column];; 
end; 

procedure TMyPlan.SetMyCell(Row, Column: Integer; Value: TMyCell); 
begin 
    FExcel.Cells[Row, Column] := Value.Value; 
end; 

Nur damit Sie wissen, habe ich einige Komponenten bereits getan hat, und ich bin Ich lerne immer noch, wie man sie richtig macht, also mag das eine nicht anständige Struktur haben, jedenfalls ist dies das erste Mal, dass ich versuche, so etwas zu tun, eine Eigenschaft, die Eingabeparameter mit Subproperti hat es, und es scheint nicht zu funktionieren, als ob ich es würde.

Zurück zum Thema, ist es egal, wie ich mein Eigentum nennen

Set: MyPlan.Cell [1, 1] .Wert: = '1';

Erhalten: ShowMessage (MyPlan.Cell [1, 1] .Value);

In beiden Fällen wird nur die GetMyCell-Funktion ausgelöst. Warum ist das?

+0

Sie sollten hinzufügen 'override' Anweisung zu' Create' und 'Destroy' –

+0

I tihnk es ist ein Fehler, einen Referenztyp für' TMyCell' zu verwenden. –

+0

@Dalija Prasnikar die Komponente haben eigentlich keinen Konstruktor oder Destruktor, ich habe sie nur zu Leuten hinzugefügt, die vielleicht denken, ich habe die FExcel-Variante nicht initialisiert, aber ich weiß, dass, wenn ich sie verwenden muss, Override notwendig ist –

Antwort

3

Siehe meine Antwort auf diese Frage: "Left side cannot be assigned to" for record type properties in Delphi

Während das, was du tust, nicht ganz dasselbe ist, ist es ähnlich. In Ihrem Fall weisen Sie jedoch eine neue Instanz von TMyCell für alle Zugriff auf GetMyCell zu. Diese "temporäre" Instanz wird nicht freigegeben und wird undicht (es sei denn, Sie tun dies auf einer der ARC-Plattformen).

Der Grund, warum Ihr SetMyCell nicht aufgerufen wird, liegt darin, dass Sie die Zelle nicht selbst setzen, sondern einen Wert auf die Zelleninstanz setzen (die oben erklärt wurde undicht ist).

+0

Ich habe verstanden, was Sie über diese Antwort und die Antwort auf die andere Frage gesagt haben, aber ich kann meine Situation nicht mit der anderen Beziehung in Beziehung setzen, weil Sie im Datensatz einen Schreibvorgang direkt auf die Datensatzvariable verwenden, aber in Mein Fall muss ich in einer Prozedur schreiben. Tut mir leid, wenn das nicht der Punkt ist, den Sie mir wünschen, aber ich kann nichts mehr sehen. –

+1

Es gibt mehrere verschiedene Operationen innerhalb der MyPlan.Cell [1, 1] .Value: = '1'; Erklärung. MyPlan.Cell [1,1] muss * die * Zelle lesen (auch Call GetMyCell genannt), bevor sie das '.' Operator. Dieser Wert wird vom Compiler in eine lokale temporäre Variable geschrieben. Der ".Value" -Teil arbeitet nur auf diesem temporären und an keinem Punkt wird SetMyCell jemals aufgerufen. –