Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS ClickHandler mehrmals benutzten? (https://www.delphipraxis.net/178758-clickhandler-mehrmals-benutzten.html)

Crocotronic 25. Jan 2014 13:53

ClickHandler mehrmals benutzten?
 
Hallo,
ich versuche gerade, einen NavBarClickHandler mehrmals zu benutzten, was ja sehr sinnvoll ist. Wenn ich jetzt z.B. auf einem ViewController 2 Buttons in der Leiste hab, dann will ich ja nicht extra 2 Klassen schreiben, sondern lieber sowas machen:
Delphi-Quellcode:
type
  IUINavBarClickHandler = interface(NSObject)
  ['{6D8473BD-461C-479D-ADF6-59F933EDA57B}']
    procedure Click; cdecl;
  end;

  TUINavBarClickHandler = class(TOCLocal)
  private
   FKind: Integer;
  protected
   function GetObjectiveCClass: PTypeInfo; override;
  public
   procedure Click; cdecl;
  end;
Beim Kreieren setzt ich dann das FKind. Beim Klicken führt er dann abhängig von FKind eine Funtkion aus. Nur leider ist das Attribut entweder 0 oder ein zufällig Zahl.
Warum kann ich das so nicht machen? Hat jemand eine Lösung für mein Problem?

Viele Grüße
Croco

himitsu 25. Jan 2014 14:25

AW: ClickHandler mehrmals benutzten?
 
Dein TUINavBarClickHandler implementiert wirklich nicht das Inferface IUINavBarClickHandler?

Zitat:

Warum kann ich das so nicht machen? Hat jemand eine Lösung für mein Problem?
Hab keine wirkliche Idee, aber da sonst alle wichtigen Infos fehlen, ist das auch kein Wunder.
Zitat:

Beim Kreieren setzt ich dann das FKind.
Wie?

Crocotronic 25. Jan 2014 15:05

AW: ClickHandler mehrmals benutzten?
 
Ich hab mir das ganze von TMS abgeguckt (aus TMSNativeUIToolbar). Dort steht folgendens:
Delphi-Quellcode:
  {$IFDEF IOS}
  IUIToolBarEventHandler = interface(NSObject)
  ['{1ACF3DFA-A90B-4F06-ACF1-8A40076BC9ED}']
    procedure Click(Sender: Pointer); cdecl;
  end;

  TUIToolBarEventHandler = class(TOCLocal)
  private
    FControl: TTMSFMXNativeUIToolBar;
  protected
    function GetObjectiveCClass: PTypeInfo; override;
  public
    //IUIToolBarEventHandler
    procedure Click(Sender: Pointer); cdecl;
  end;
  {$ENDIF}
und das Kreieren:
Delphi-Quellcode:
  FToolBarEventHandler := TUIToolBarEventHandler.Create;
  FToolBarEventHandler.FControl := Self;
Dachte ich kann das gleiche mit einem Integer machen, aber scheinbar war der Gedanke falsch

Meine Anwendung für das Ding sieht so aus:
Delphi-Quellcode:
 ToolbarItem1:= FMX.TMSNativeUICore.TUIBarButtonItem.Create;
 ToolBarClickHandler:= TUIToolBarClickHandler.Create;
 ToolBarClickHandler.FKind:= 2;
 ToolbarItem1.initWithBarButtonSystemItem(UIBarButtonSystemItemRefresh, ToolBarClickHandler.GetObjectID, sel_getUid('Click'));
 bis[0]:= (ToolbarItem1 as ILocalObject).GetObjectID;

 arr:= TNSArray.Wrap(TNSArray.OCClass.arrayWithObjects(@bis[0], Length(bis)));
 VPlanView.ViewController.navigationItem.setRightBarButtonItems(arr);

Sir Rufo 25. Jan 2014 15:07

AW: ClickHandler mehrmals benutzten?
 
Geb der Instanz doch eine anonyme Methode mit, dann hast etwas Universelles

Crocotronic 25. Jan 2014 15:30

AW: ClickHandler mehrmals benutzten?
 
Was dann so aussehen würde?
Delphi-Quellcode:
type
  IUIToolbarClickHandler = interface(NSObject)
  ['{6D8473BD-461C-479D-ADF6-59F933EDA57B}']
    procedure Click; cdecl;
  end;

  THandlerProc = reference to procedure;

  TUIToolBarClickHandler = class(TOCLocal)
  private
   FMyProc: THandlerProc;
  protected
   function GetObjectiveCClass: PTypeInfo; override;
  public
   procedure Click; cdecl;
  end;


function TUIToolBarClickHandler.GetObjectiveCClass;
begin
 Result:= TypeInfo(IUIToolbarClickHandler);
end;

procedure TUIToolBarClickHandler.Click;
begin
 FMyProc;
end;

Sir Rufo 25. Jan 2014 15:47

AW: ClickHandler mehrmals benutzten?
 
Jo, obwohl, so ist es schöner zu benutzen
Delphi-Quellcode:
type
  IUIToolbarClickHandler = interface(NSObject)
  ['{6D8473BD-461C-479D-ADF6-59F933EDA57B}']
    procedure Click; cdecl;
  end;

  THandlerProc = reference to procedure;

  TUIToolBarClickHandler = class(TOCLocal)
  private
    FHandler: THandlerProc;
  protected
    function GetObjectiveCClass: PTypeInfo; override;
    constructor Create( Handler : THandlerProc );
  public
    class function Construct( Handler : THandlerProc ) : IUIToolbarClickHandler;
    procedure Click; cdecl;
  end;

class function TUIToolBarClickHandler.Construct( AHandler : THandlerProc ) : IUIToolbarClickHandler;
begin
  Result := Self.Create( AHandler );
end;

constructor TUIToolBarClickHandler.Create( AHandler : THandlerProc );
begin
  inherited Create;
  FHandler := AHandler;
end;

function TUIToolBarClickHandler.GetObjectiveCClass;
begin
 Result:= TypeInfo(IUIToolbarClickHandler);
end;

procedure TUIToolBarClickHandler.Click;
begin
  if Assigned( FHandler ) then
    FHandler(); // mit Klammern ist auf jeden Fall die procedure gemeint und nicht der Variablenwert ;o)
end;
und dann nur noch
Delphi-Quellcode:
var
  HelloWorldHandler : IUIToolbarClickHandler;

HelloWorldHandler := TUIToolBarClickHandler.Construct( 
  procedure
  begin
    ShowMessage( 'Hello World' );
  end );

Crocotronic 25. Jan 2014 16:11

AW: ClickHandler mehrmals benutzten?
 
Sobald ich das dann in sowas hier rein packe und das ToolbarItem klicke, ist das Attribut null (bzw assigned = false) :(
Delphi-Quellcode:
 ToolbarItem:= TUIBarButtonItem.Create;
 ToolBarClickHandler := TUIToolBarClickHandler.Construct(
  procedure
  begin
   showmessage('Test');
  end );

 ToolbarItem.initWithBarButtonSystemItem(UIBarButtonSystemItemRefresh, ToolBarClickHandler.GetObjectID, sel_getUid('Click'));
 VPlanView.ViewController.navigationItem.setRightBarButtonItem(ToolbarItem,false);

Crocotronic 2. Feb 2014 12:22

AW: ClickHandler mehrmals benutzten?
 
Es funktioniert doch...der Handler muss nur ein Attribut von der Klasse sein (-> FToolBarClickHandler)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz