![]() |
Vergeiche bei records? Bei mir gehts net!
Hallo
Ich hab mal wieder ein problem.... Ich habe dass hier deklariert
Delphi-Quellcode:
sowie dass hier
type
TAnschluss = record InterfaceID : Cardinal; ModulNr : Cardinal; Anschlussnr : Cardinal; end; {TGleis deklarieren} type TGleis = record Case vorhanden : boolean of true: ( imagelistindex : cardinal; Ausrichtung : TGleisausrichtung; Gleisstellung : cardinal; Anschluss : Array[0..3] of TAnschluss; ) end;
Delphi-Quellcode:
nun hab ich dass hier
FGBArray : Array of Array of TGleis;
Delphi-Quellcode:
procedure TJTGleisbild.SetGleis(X, Y : Cardinal; Gleis : TGleis);
begin //gleis in Array setzen, falls es sich unterscheidet. {überprüfen ob das element innerhalb des array ist} If (X <= FGBColCount) and (Y <= FGBRowCount) then if FGBArray[X,Y] <> Gleis then FGBArray[X,Y]:=Gleis; end; Ich übergebe der procedure ein TGleis. Dieser soll nun prüfen ob X und Y inerhalb des arrays liegen und dann soll er schaun ob das an der position X,Y sich befindende TGleis ungleich dem übergebenen TGleis ist und falls dass so ist dann soll er das Tgleis im Array durch das neue Tgleis ersetzen. hier meint er dann...
Delphi-Quellcode:
if FGBArray[X,Y] <> Gleis then
Zitat:
gruß snow |
Re: Vergeiche bei records? Bei mir gehts net!
Hallo snow,
Delphi erlaubt zwar die direkte Zuweisung von Records, nicht aber deren Vergleich. Du wirst also die Felder der Records einzeln vergleichen müssen. Bei deiner Datenstruktur könntest du theoretisch noch mit CompareMem arbeiten, aber sobald dynamische Elemente oder (statische) Strings in Spiel kommen, wird das scheitern. Gruß Hawkeye |
Re: Vergeiche bei records? Bei mir gehts net!
Hab leider vor später statische arrays und auch strings zu verwenden. Werd mir also eine vergleich-function schreiben müssen.
gruß snow |
Re: Vergeiche bei records? Bei mir gehts net!
Alternative (ab Delphi 2006):
Du kannst dir die Vergleichsoperatoren überladen. Das kommt zwar im endeffekt hier aufs gleiche raus, ist aber im Code besser und einfacher lesbar :) |
Re: Vergeiche bei records? Bei mir gehts net!
Hab leider nur Delphi 7...... :cry:
gruß snow |
Re: Vergeiche bei records? Bei mir gehts net!
Dann schreibt dir eine Funktion, die den Vergleich übernimmt...
|
Re: Vergeiche bei records? Bei mir gehts net!
Zitat:
|
Re: Vergeiche bei records? Bei mir gehts net!
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Vergeiche bei records? Bei mir gehts net!
Vorschlag: Interfaces. Beispiel für die Variante mit kleiner Null für "kleiner", gleich Null für "gleich" und größer Null für "größer":
Delphi-Quellcode:
Vorteile gegenüber Verwendung von Records:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type //Pro Klasse eigentlich eine eigene Unit. IComparable = interface function CompareTo(Other: TObject): Integer; end; ECompareException = class(Exception); TSomeRecord = class(TInterfacedObject, IComparable) private FSomeInt: Integer; FSomeString: String; public constructor Create(Str: String; Int: Integer); function CompareTo(Other: TObject): Integer; published property SomeString: String read FSomeString write FSomeString; property SomeInt: Integer read FSomeInt write FSomeInt; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TSomeRecord } function TSomeRecord.CompareTo(Other: TObject): Integer; begin if (Other is TSomeRecord) then begin Result := Self.SomeInt - TSomeRecord(Other).SomeInt; end else begin raise ECompareException.Create(EmptyStr); end; end; constructor TSomeRecord.Create(Str: String; Int: Integer); begin inherited Create; FSomeInt := Int; FSomeString := Str; end; //Beispiel procedure TForm1.Button1Click(Sender: TObject); var Rec1, Rec2: TSomeRecord; Rel: String; begin Rec1 := TSomeRecord.Create('Do you have', Random(100)); Rec2 := TSomeRecord.Create('stairs in your house?', Random(100)); try case Rec1.CompareTo(Rec2) of -MaxInt..-1: Rel := ' < '; 0: Rel := ' = '; 1..MaxInt: Rel := ' > '; end; Button1.Caption := IntToStr(Rec1.SomeInt) + Rel + IntToStr(Rec2.SomeInt); finally Rec1.Free; Rec2.Free; end; end; end.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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 by Thomas Breitkreuz