Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   UNITS für VCL und FMX gleichzeitig verwenden (https://www.delphipraxis.net/180379-units-fuer-vcl-und-fmx-gleichzeitig-verwenden.html)

bernhard_LA 16. Mai 2014 07:57

UNITS für VCL und FMX gleichzeitig verwenden
 
ich möchte div. Units von mir erstellt für Anwendungen unter dem VCL Framework in Zukunft auch mit Anwendungen im FMX Framework verwenden .
Die Plattform spezifischen Units von Delphi verhindern aber diesen Ansatz

Delphi-Quellcode:

   interface

   uses
   Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, System.SysUtils, ....

Ferner weigert sich Delphi folgenden VCL Code procedure zu kompilieren

Delphi-Quellcode:

   procedure Write2Memo (   ...... ; aMemo : Tmemo ) ;
Als Fehlermeldung kommt FXM.Memo nicht kompatibel zu VCL.Memo.
Kann man über ??????? abfragen ob die Anwendung für die FMX oder VCL PLatform ist und entsprechend die Units einbinden/Anpassen ?
Wenn die Lösung dann Lazarus als weitere Compiler Option unterstützt , wäre dieser Ansatz ggf. in der Zukunft auch ein Thema für uns.
Das ganze soll natürlich für "Komponenten" funktionieren die auf allen Plattformen identisch sind, als amemo.lines.add(...)
sobald ich Plattform spezifischen Code habe ist hier Schluss.
;

DeddyH 16. Mai 2014 08:13

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Ich hab zwar kein Firemonkey, aber müsste das nicht über div. IFDEFs zu machen sein?

bernhard_LA 16. Mai 2014 08:15

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
aber finde ich heraus ob die Hauptanwendung im FXM Framework jetzt erstellt wird ? :shock:

matthiaskary 16. Mai 2014 08:22

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Hallo,

z.b. kannst du das so abfragen.

{$IF DECLARED(FireMonkeyVersion)}
{$DEFINE HAS_FMX}
{$ELSE}
{$DEFINE HAS_VCL}
{$IFEND}

Neutral General 16. Mai 2014 08:28

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Ich bin mir nicht sicher ob ich das Problem richtig verstehe aber vllt. reicht es in deinem Fall schon wenn du vor explizit VCL.TMemo, bzw. FMX.TMemo bei Deklarationen.

Kombiniert mit einem IFDEF sollte das dann auf jeden Fall hinhauen.

RWarnecke 16. Mai 2014 08:29

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Ich lege Dir mal diese Seite ans Herz. Die sollte alle Deine Fragen beantworten.

himitsu 16. Mai 2014 08:43

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Sollte man nicht besser das ausnutzen, wofür diese Prefixe eingeführt wurden?

Man gibt im Projekt die entsprechenden Namespaces an (sollten sogar schon standardmäßig an sein, bei neueren Projekten)
und schreibt in die units nur noch
Delphi-Quellcode:
Controls, Forms, StdCtrls, {System.}SysUtils, ....
rein.

Delphi findet nun die Units nicht und probiert die angebenen Namespaces durch, wobei in der VCL-Anwendung
dann das
Delphi-Quellcode:
Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, {System.}SysUtils, ....
bei raus komm

und bei einer FireMonkey das
Delphi-Quellcode:
Fmx.Controls, Fmx.Forms, Fmx.StdCtrls, {System.}SysUtils, ....
.

(System sollte in beiden Anwendungen definiert sein)

RWarnecke 16. Mai 2014 08:52

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Das mit den Namespaces hat bei mir noch nie richtig funktioniert eher nur sporadisch. Ich gehe lieber über die Compilerschalter, das ist aus meiner Sicht sicherer und ich kann es besser definieren.

Sir Rufo 16. Mai 2014 09:46

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Ich vermute mal, du hast UI und Logik zu dicht zusammen.

Eigentlich gibt es keinen Grund direkt in ein Memo zu schreiben ...

Man schreibt einfach in eine StringList und diese StringList zeigt die Form einfach in dem Memo an.

Hmmm, eigentlich macht man das noch etwas anders ....

In eine Struktur wird ein Eintrag erstellt (Record oder Klassen-Instanz ist egal).
Aus diesem/diesen Einträgen wird dann zur Visualisierung eine StringList gefüllt.
Die Form zeigt im Memo dann den Inhalt dieser StringList an.

uligerhardt 16. Mai 2014 10:09

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Zitat:

Zitat von Sir Rufo (Beitrag 1259034)
Man schreibt einfach in eine StringList und diese StringList zeigt die Form einfach in dem Memo an.

... oder man definiert Write2Memo mit einem TStrings-Parameter anstelle von TMemo und übergibt Memo1.Lines an diesen. Etwa so:
Delphi-Quellcode:
procedure Write2Memo(ALines: TStrings);
begin
  ALines.BeginUpdate;
  try
    ALines.Add('111');
    ALines.Add('222');
    ALines.Add('333');
  finally
    ALines.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Write2Memo(Memo1.Lines);
  Write2Memo(ListBox1.Items); // Geht dann z.B. auch für Listboxen
end;

Sir Rufo 16. Mai 2014 10:27

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
@uligerhardt

Das habe ich auch zuerst gedacht, aber diesen Befehl ruft er wohl aus der Logik heraus auf und auch da hat er keinen vernünftigen Zugriff auf die StringList.

Stevie 16. Mai 2014 17:16

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Zitat:

Zitat von uligerhardt (Beitrag 1259036)
... oder man definiert Write2Memo mit einem TStrings-Parameter anstelle von TMemo und übergibt Memo1.Lines an diesen.

... und nennt dann noch sinnvollerweise die Routine um in Write2Strings ;)

uligerhardt 16. Mai 2014 18:55

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Zitat:

Zitat von Stevie (Beitrag 1259082)
... und nennt dann noch sinnvollerweise die Routine um in Write2Strings ;)

Das würde sich anbieten. :mrgreen:

bernhard_LA 20. Mai 2014 10:44

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
ich komme nicht weiter bei diesem Problem :

unter VCL verwende ich
Delphi-Quellcode:
Controls, Forms, System.SysUtils, stdctrls, .....
alles super ---- und unter FMX will ich

Delphi-Quellcode:
fmx.Controls, fmx.Forms, System.SysUtils, fmx.memo, fmx.stdctrls,
verwenden, nur kennt mein DELPHI die Unit fmx.stdctrls nicht ...., bleibt rot unterstrichen... Compile von Write2Memo klappt also noch nicht


Nachtrag Trennung von Code in verschiedene Lagen :



MainForm ( VCL oder FMX) -> Unit_mit_oftgebrauchten_GUI_Funktionen -> Units_mit_Datenklassen

in Unit_mit_oftgebrauchten_GUI_Funktionen findet man dann Procedure WRITE2MEMO ( eineDatenklasse , einMemo) ;

mkinzler 20. Mai 2014 10:56

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Wenn Namespaces dann konsequent. Ich würde dann auch bei den VCL Units Vcl. davorschreiben.

uligerhardt 20. Mai 2014 11:04

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Zitat:

Zitat von bernhard_LA (Beitrag 1259489)
Nachtrag Trennung von Code in verschiedene Lagen :



MainForm ( VCL oder FMX) -> Unit_mit_oftgebrauchten_GUI_Funktionen -> Units_mit_Datenklassen

in Unit_mit_oftgebrauchten_GUI_Funktionen findet man dann Procedure WRITE2MEMO ( eineDatenklasse , einMemo) ;

Trennung -> gut.
Aber warum bestehst du auf einem Control als Übergabeparameter?

Stevie 20. Mai 2014 12:49

AW: UNITS für VCL und FMX gleichzeitig verwenden
 
Wie wäre es, wenn du das gleiche Schema wie Delphi nutzt.

Platform spezifische Dinge in unterschiediche Units:
Delphi-Quellcode:
Fmx.Unit_mit_oftgebrauchten_GUI_Funktionen
und
Delphi-Quellcode:
Vcl.Unit_mit_oftgebrauchten_GUI_Funktionen
und dann brauchst du bloß MyStuff einbinden und funktioniert genauso, wie es kompiliert, wenn du StdCtrls used was bei FMX die Fmx.StdCtrls und bei VCL die Vcl.StdCtrls einbindet.


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