AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vergeiche bei records? Bei mir gehts net!

Ein Thema von snow · begonnen am 29. Dez 2007 · letzter Beitrag vom 30. Dez 2007
Antwort Antwort
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#1

Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 14:57
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

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...

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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 15:55
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
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#3

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 16:05
Hab leider vor später statische arrays und auch strings zu verwenden. Werd mir also eine vergleich-function schreiben müssen.

gruß snow
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 16:14
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
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
snow

Registriert seit: 28. Jun 2007
277 Beiträge
 
#5

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 16:23
Hab leider nur Delphi 7......

gruß snow
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 16:47
Dann schreibt dir eine Funktion, die den Vergleich übernimmt...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.549 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 29. Dez 2007, 16:52
Zitat von Dax:
Dann schreibt dir eine Funktion, die den Vergleich übernimmt...
Eben, kann ja so schwer nicht sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 30. Dez 2007, 01:06
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.
Angehängte Dateien
Dateityp: pas comparerecord_152.pas (5,9 KB, 15x aufgerufen)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Vergeiche bei records? Bei mir gehts net!

  Alt 30. Dez 2007, 03:02
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
Dani H.
At Least I Can Say I Tried
  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 05:49 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