Einzelnen Beitrag anzeigen

DevilsCamp
(Gast)

n/a Beiträge
 
#3

Re: Scrollbalken in eigener Komponente

  Alt 27. Jan 2007, 15:20
Zitat von Jürgen Thomas:
Empfehlung: Such Dir eine Vorlage mit ScrollBars - wie z.B. TStringGrid - aus, von der Du Deine eigene Lösung ableitest. Dann kannst Du auf viele Eigenschaften und Methoden zurückgreifen und musst das nicht selbst entwickeln. Gruß Jürgen
Wenn Du mir dann noch erklären kannst, wie ich es schaffe den InplaceEditor des Stringgrids so umzubiegen, dass ein eigener verwendet wird, bei dem ich ein OnHide Ereignis verwenden kann (damit ich reagieren kann, wenn sich der Editor schliesst), dann würde ich das gerne machen.
Bisher ist es aber so, dass die Hide-Methode meines eigenen Editors noch nichtmal in das Programm compiliert wird.

Delphi-Quellcode:
unit Unit2;

interface

uses Classes, Windows, Grids;

type
  TMyStringGrid = class;
  TMyStringGridExitEdit = procedure(Sender: TMyStringGrid; Value: string) of object;
  
  TMyInplaceEdit = class(TInplaceEdit)
  private
    FOnHide : TNotifyEvent;
  public
    constructor Create(AOwner: TComponent); override;
    
    procedure Hide;
  published
    property OnHide: TNotifyEvent read FOnHide write FOnHide default nil;
  end;

  TMyStringGrid = class(TStringGrid)
  private
    FMyInplaceEdit: TMyInplaceEdit;
    FOnExitEdit: TMyStringGridExitEdit;

    procedure OnInplaceEditorHide(Sender: TObject);
  protected
    function CreateEditor: TInplaceEdit; override;
  public
    constructor Create(AOwner: TComponent);
  published
    property OnExitEdit: TMyStringGridExitEdit read FOnExitEdit write FOnExitEdit;
  end;

implementation

{ TMRStringGrid }

constructor TMyStringGrid.Create(AOwner: TComponent);
begin
  inherited;

  FOnExitEdit := nil;
end;

function TMyStringGrid.CreateEditor: TInplaceEdit;
begin
  FMyInplaceEdit := TMyInplaceEdit.Create(Self);
  FMyInplaceEdit.OnHide := OnInplaceEditorHide;
  Result := FMyInplaceEdit;
end;

procedure TMyStringGrid.OnInplaceEditorHide(Sender: TObject);
var
  s: string;
begin
  s := FMyInplaceEdit.Text;

  if (Assigned(FOnExitEdit)) then
    FOnExitEdit(Self, s);
end;

{ TMRInplaceEdit }

constructor TMyInplaceEdit.Create(AOwner: TComponent);
begin
  inherited;

  FOnHide := nil;
end;

procedure TMyInplaceEdit.Hide;
begin
  if HandleAllocated and IsWindowVisible(Handle) then
  begin
    Invalidate;
    SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_HIDEWINDOW or SWP_NOZORDER or
      SWP_NOREDRAW);
    if Focused then Windows.SetFocus(Grid.Handle);
  end;

  if (Assigned(FOnHide)) then
    FOnHide(Self);
end;

end.
  Mit Zitat antworten Zitat