Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Vergeiche bei records? Bei mir gehts net! (https://www.delphipraxis.net/105765-vergeiche-bei-records-bei-mir-gehts-net.html)

snow 29. Dez 2007 15:57


Vergeiche bei records? Bei mir gehts net!
 
Hallo

Ich hab mal wieder ein problem....
Ich habe dass hier deklariert
Delphi-Quellcode:
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;
sowie dass hier

Delphi-Quellcode:
FGBArray   : Array of Array of TGleis;
nun hab ich dass hier

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:

[Fehler] JTGleisbild.pas(80): Inkompatible Typen
wo liegt denn sein problem? kann er keine records miteinander vergleichen?

gruß snow

Hawkeye219 29. Dez 2007 16:55

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

snow 29. Dez 2007 17:05

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

Ghostwalker 29. Dez 2007 17:14

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 :)

snow 29. Dez 2007 17:23

Re: Vergeiche bei records? Bei mir gehts net!
 
Hab leider nur Delphi 7...... :cry:

gruß snow

Dax 29. Dez 2007 17:47

Re: Vergeiche bei records? Bei mir gehts net!
 
Dann schreibt dir eine Funktion, die den Vergleich übernimmt...

DeddyH 29. Dez 2007 17:52

Re: Vergeiche bei records? Bei mir gehts net!
 
Zitat:

Zitat von Dax
Dann schreibt dir eine Funktion, die den Vergleich übernimmt...

Eben, kann ja so schwer nicht sein.

sirius 30. Dez 2007 02:06

Re: Vergeiche bei records? Bei mir gehts net!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Dax
Dann schreib dir eine Funktion, die den Vergleich übernimmt...

Im Anhang hätte ich etwas, was allgemein funktioniert (also für verschiedene Recordtypen). Schneller gehts allerdings (das Programm), wenn man sich eine eigene Vergleichsfunktion je Recordtyp schreibt.

Dani 30. Dez 2007 04:02

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:
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.
Vorteile gegenüber Verwendung von Records:
  • Mehr Zusammenhalt: Daten und Operationen auf den Daten werden zusammengefasst.
  • Wiederverwendbar.
  • Wenig Code.
  • Lesbar.
  • Information Hiding etc bla bla


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