AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Typcasting korrelt ausführen, wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Typcasting korrelt ausführen, wie?

Ein Thema von delphifan2004 · begonnen am 19. Nov 2022 · letzter Beitrag vom 22. Dez 2022
Antwort Antwort
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
274 Beiträge
 
Delphi 10.3 Rio
 
#1

Typcasting korrelt ausführen, wie?

  Alt 19. Nov 2022, 20:53
Hallo, ich habe ein Projekt mit folgender Daten- und Klassenstruktur:

Delphi-Quellcode:
    { TmySelectableItem }

    TmySelectableItem = class(TObject)
               private
                fString: string;
                fselected: boolean;
                procedure SetPicture(AValue: gfxImage);
               public
                constructor Create;
                destructor Destroy; override;
                property theString : string read fString write fString;
                property selected : boolean read fSelected write fSelected;
               end;

    { TmySelectableItems }

    TmySelectableItems = class(TList) //Erzeugt eine Liste in einer Spalte
    private
       FSelItems: TList;
       function GetSelected(Index: Integer): boolean;
       function GetStrings(Index: Integer): String;
       procedure SetSelected(Index: Integer; AValue: boolean);
       procedure SetStrings(Index: Integer; AValue: String);
    public
       constructor create;
       function AddItem(aItem: TmySelectableItem): Integer;
       property Strings[Index: Integer]: String read GetStrings write SetStrings; default;
       property Selected[Index: Integer]: boolean read GetSelected write SetSelected;
    end;

    { TmySelectBox }

    TmySelectBox = class (TmyAnyBox)
        public
            

            strings : TmySelectableItems; //Hier entsteht die Spalte die in dieser Klasse auch angezeigt wird
            
    end;
Mein NachfolgeObjekt sieht so aus:
Delphi-Quellcode:
type
  TmySelectableMatrixOfCols_And_Rows = class(TList) //Weil ich nicht nur Zeilen, sondern auch Spalten haben will
    FColCount: Integer;
    FRowCount: Integer;
    FGridCols: TmySelectBox.Strings;
    
    //TMySelectBox soll hier die Spalten liefern, deren Inhalt TmySelectableItems sind und zeilenweise angeordnet sind
    //TmySelectBox ist sichtbar und enthält das Feld Strings vom Typ TmySelectableItems
    
    function GetCells(ColIX, RowIX: Integer): TmySelectableItem; //TMySelectBox ist die Spalte, die Strings (TmySelectableItems) die Zeileninhalte
    function GetCols: Integer;
    function GetRows: Integer;
    procedure SetCells(ColIX, RowIX: Integer; AValue: TmySelectableItem);
    procedure SetCols(AValue: Integer);
    procedure SetRows(AValue: Integer);
  public
    constructor Create;
    function AddCol(aCol:TmySelectableItems): Integer;
    property GridCells[ColIX,RowIX: Integer]: TmySelectableItem read GetCells write SetCells;
    property GridCols: Integer read GetCols write SetCols;
    property GridRows: Integer read GetRows write SetRows;
  end;

  TmySelectableItemsUsingObject = class
    GridCells: TmySelectableMatrixOfCols_And_Rows;
  end;
  
  
  procedure TmySelectableMatrixOfCols_And_Rows.SetCells(ColIX, RowIX: Integer;
    AValue: TMySelectableItem);

  begin
    if (ColIX<=GetCols-1) and (RowIX<=GetRows) then
    TMySelectableItem(TMySelectBox(GridCols.Items[ColIX]).strings.Items[RowIX]) := AValue; //Hier meckert der Compiler !!!!!!!!!!!!!!!
                                      //Items[] kommt von TList, dem Vorgängerobjekt
  end;


constructor TmySelectableItemsUsingObject.Create
begin
  for c:=0 to Columns-1 do
  begin
    TuiItem := TtuiSelectableItem.Create;
    GridCells.AddCol(TmySelectBox.Create(
         theParentBox,
         theX+c*ColWidth+1,
         theY,
         ColWidth,
         RowHeight
         ));
    for r:=0 to Rows-1 do
    begin
      MyItem.theString:='1234';
      TMySelectBox(GridCols.Items[c])).addItem(MyItem); //Hier meckert der FPC Compiler!!!!!!!!!!!!!!!!!!!!
    end;
  end;
end;
Hier meckert der FPC Compiler an den kommentierten Stellen, der Delphi Compiler wurde das vermutlich auch.

Wie mache ich die Datenabfrage bzw. Zuweisung hier richtig? (Freepascal) Oder ist die Syntax hierfür in Freepascal und Delphi wirklich gleich?

Geändert von delphifan2004 (19. Nov 2022 um 21:08 Uhr)
  Mit Zitat antworten Zitat
ggscholz
Online

Registriert seit: 20. Nov 2013
Ort: Aachen
68 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Typcasting korrelt ausführen, wie?

  Alt 20. Nov 2022, 11:17
Ich sehe eine nicht geöffnete Klammer.
TMySelectBox(GridCols.Items[c])).addItem(MyItem);
Gerd
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Typcasting korrelt ausführen, wie?

  Alt 20. Nov 2022, 12:16
FPC kennt doch auch irgendwie Generics?

TList<TmySelectableItem> und schon hat man eine Liste, mit automatischem Cast ... muß man selbst nichts machen und macht dadurch auch keine Fehler.



Und dann SoftCasts, anstatt HardCasts, zu mindestens so lange du nicht weißt was wo wie richtig ist (kann man ja später aus Performancegründen wieder umdrehen).
Der Compiler meckert nur, wo es komplett inkompatibel wird, wenn man z.B. direkt TmySelectableItems zu TmySelectBox casten will.
Schon sagt dir zur Laufzeit das Programm auch, wenn wo Intern was falsch läuft. z.B. TmySelectableItems zu TmySelectBox casten, aber mit TObjekt oder Pointer als Zwischentypen.

Delphi-Quellcode:
// statt
TmySelectableItem(xxx.Items[i])

(xxx.Items[i] as TmySelectableItem)
// bzw.
(TObject(xxx.Items[i]) as TmySelectableItem) // wenn es ein Pointer ist und AS nicht direkt geht
$2B or not $2B
  Mit Zitat antworten Zitat
itblumi

Registriert seit: 28. Mär 2009
73 Beiträge
 
Delphi XE6 Professional
 
#4

AW: Typcasting korrelt ausführen, wie?

  Alt 21. Nov 2022, 00:32
Generics sind in FPC und Delphi unterschiedlich da FPC schon viel länger Generics implementiert als Delphi.
Man kann aber FPC im Mode Delphi compilieren und dann kann man das genau wie in Delphi umsetzen.

Code:
{$mode Delphi}

TMyGenericList = class(TList<TmySelectableItem>)
end;

{$mode ObjFPC}

TSMyGenericList = specialize TList<TmySelectableItem>;

TMyGenericList = class(TSMyGenericList)
end;
Ich persönlich bevorzuge da die Delphi Variante, da ich viel weniger schreiben muss.
Jan
Ein neuer Tag bringt so einiges mit sich. Was auch immer es ist, es bleibt ein kleines Abenteuer.

Geändert von itblumi (21. Nov 2022 um 00:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Typcasting korrelt ausführen, wie?

  Alt 21. Nov 2022, 01:00
FPC wird doch bestimmt auch CodeTemplates kennen?
Da könntest dir ja ein Template für erstellen.

So geht es nicht?
TMyGenericList = class(specialize TList<TmySelectableItem>)

Wenn doch, dann
TMyGenericList = class({$IFDEF FPC}specialize{$ENDIF} TList<TmySelectableItem>)
OK, wegen dem $MODE dann wohl irgendwie so
TMyGenericList = class({$IF Defined(FPC) and not Defined(DelphiMode)}specialize{$IFEND} TList<TmySelectableItem>)
$2B or not $2B
  Mit Zitat antworten Zitat
itblumi

Registriert seit: 28. Mär 2009
73 Beiträge
 
Delphi XE6 Professional
 
#6

AW: Typcasting korrelt ausführen, wie?

  Alt 21. Nov 2022, 01:11
Nein leider nicht ich wollte dies auch gern so in meiner anderen Klasse umsetzen,
aber das key Wort specialize darf leider nicht in einer Klassen Ableitung eingesetzt werden.
Jan
Ein neuer Tag bringt so einiges mit sich. Was auch immer es ist, es bleibt ein kleines Abenteuer.
  Mit Zitat antworten Zitat
itblumi

Registriert seit: 28. Mär 2009
73 Beiträge
 
Delphi XE6 Professional
 
#7

AW: Typcasting korrelt ausführen, wie?

  Alt 21. Nov 2022, 01:17
Da bleibt dann nur die Variante den Mode der ganzen unit zu switchen oder halt die andere schreibweise zu benutzen.
Jan
Ein neuer Tag bringt so einiges mit sich. Was auch immer es ist, es bleibt ein kleines Abenteuer.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
274 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Typcasting korrelt ausführen, wie?

  Alt 21. Nov 2022, 18:06
Danke Euch allen für Eure Antworten und Anregungen, jetzt guck ich mir das alles noch mal an.
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Typcasting korrelt ausführen, wie?

  Alt 22. Dez 2022, 17:27
FPC wird doch bestimmt auch CodeTemplates kennen?
Da könntest dir ja ein Template für erstellen.
FPC ist nur der Compiler. Das Äquivalent zu CodeTemplates wird von der IDE bereitgestellt und zumindest Lazarus unterstützt diese.

Wenn doch, dann
TMyGenericList = class({$IFDEF FPC}specialize{$ENDIF} TList<TmySelectableItem>)
OK, wegen dem $MODE dann wohl irgendwie so
TMyGenericList = class({$IF Defined(FPC) and not Defined(DelphiMode)}specialize{$IFEND} TList<TmySelectableItem>)
Korrekterweise wäre es {$IF Defined(FPC) and not Defined(FPC_DELPHI)}specialize{$IFEND}
Nein leider nicht ich wollte dies auch gern so in meiner anderen Klasse umsetzen,
aber das key Wort specialize darf leider nicht in einer Klassen Ableitung eingesetzt werden.
Seit FPC 3.2.0 geht das.
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Typcasting korrelt ausführen, wie?

  Alt 22. Dez 2022, 20:03
Ja sorry, Lazarus natülich.

Wir sind hier einfach zu verwöhnt, da hier im Delphi die Sprache, der Compiler und die IDE gleich heißen.

OK, die Sprache hieß früher mal Pascal, vor Delphi (als die IDE noch Turbo Pascal hieß, bzw. PolyPascal, davor BLS-Pascal und zu Begin nur Pascal) und inzwischen heißt sie seit wenigen Jahren nun offiziell "Delphi Language" (weil die Sprache hat sich weiterentwickelt und ist nun was Besseres Anderes), auch wenn scheinbar fast niemand diese Bezeichnung benutzt.
Und ja, die IDE heißt intern immernoch noch anders, nämlich so, wie Delphi ursprünglich mal heißen sollte, also TAppBuilder, aber durch einen glücklichen Zufall fiel kurz vor Veröffentlichung auf das Er bereits vergeben war.
$2B or not $2B

Geändert von himitsu (22. Dez 2022 um 20:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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