Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Set Of ? (https://www.delphipraxis.net/9197-set.html)

Pseudemys Nelsoni 20. Sep 2003 10:42


Set Of ?
 
hoi,

ich bin gerade in meinem buch(*g*) beim thema Typen angelangt, ok was ein Aufzählungstyp ist weiss ich ja nun, aber was bewirken "Mengen" ?

also z.b bei sowas:

Delphi-Quellcode:
Type TIrgendwas = (bla1, bla2, bla3);
     irgendwas2 = Set Of TIrgendwas;
Delphi-Quellcode:
var
  irgendwas: irgendwas2;
begin
  irgendwas := bla2;
end;
im grossen und ganzen meine ich...wozu das "set of" ist und wozu man "Mengen" braucht?

gibts irgendwie ein beispiel wo man soetwas braucht?

Hansa 20. Sep 2003 10:54

Re: Set Of ?
 
Ein Set ist eine "Menge", z.B.:
Delphi-Quellcode:
var buchstaben : set of char;
jetzt kannst du schreiben:
Delphi-Quellcode:
buchstaben := ['a'..'z','A'..'Z'];
Dann wären da (fast alle Buchstaben drin, aber keine Zahlen, äöü und andere Sonderzeichen. Wichtig wird eigentlich nur der Operator "IN"
Mit z.B.:
Delphi-Quellcode:
if ch IN buchstaben
läßt sich überprüfen, ob ch in der Menge der Buchstaben enthalten ist, oder nicht.

Pseudemys Nelsoni 20. Sep 2003 11:00

Re: Set Of ?
 
danke hansa, das hilft mir schonmal weiter 8)

Jan 15. Okt 2003 09:55

Re: Set Of ?
 
Hallo DP,
habe dazu noch eine Frage:
wie überprüfe ich ob ein String in einem set vorkommt?
Mein Set sieht so aus:
Delphi-Quellcode:
var nameset : set of (comment, name, id);
und dann muss ich 'comment' in dem set wiederfinden.
Gruß
Jan

sakura 15. Okt 2003 10:01

Re: Set Of ?
 
Da ein Set nicht aus Strings besteht, kannst Du auch nicht testen, ob ein String im Set vorkommt ;-)

...:cat:...

Jan 15. Okt 2003 10:05

Re: Set Of ?
 
Moin sakura,
wenn das anders wäre hätte ich ja nicht gefragt, in meiner Frage zielte ich darauf ab, ob ich den String irgendwie so umwandeln kann, dass er ein cardinal, oder irgendein anderer Wert ist, den ich im set wiederfinden kann.
Gruß
Jan

Jan 15. Okt 2003 12:24

Re: Set Of ?
 
*Schieb* :angle:

Das weiß doch hier ganz bestimmt jemand, der nur darauf aufmerksam gemacht werden muss.
Und dass es nicht geht will ich ganz einfahc nicht glauben.
Greetings
Jan

Hansa 15. Okt 2003 12:32

Re: Set Of ?
 
Zitat:

Zitat von Jan
*Schieb* :angle:

Das weiß doch hier ganz bestimmt jemand...

Sakura hat doch schon alles gesagt und was nicht geht, das kann keiner Dir hier erklären, daß es geht. Behauptest Du 1 + 1 = 3 und fragst einen was man machen muß, damit das doch stimmt, wer wüßte weltweit darauf eine Antwort :?: :mrgreen: :mrgreen:

Du mußt es eben anders machen. Viele Wege führen nach Rom. 8)

Jan 15. Okt 2003 12:37

Re: Set Of ?
 
Hallo Hansa,
das will mir einfach nicht in den Kopf gehen...
Da habe ich einen String, der exakt den gleichen Wert hat wie der Name eines Teils meines Sets, und ich soll nicht festellen können, ob der Name in dem Set vorhanden ist? Das wäre doch dümmer als doof. :gruebel: wenn ich jetzt statt 'comments' einfach comments im Set suchen würde würde es ja klappen, der Weg dahin kann doch nicht so schwer sein...
Wenn das nicht klappt müsste ich den ganzen kram wieder mit einem Array machen, der über eine for-schleife mit abbruchbedingung durchsucht wird und dann eine booleansche hilfsvariable setzt.
Ist Delphi da wirklich so unflexibel?
Gruß
Jan

Hansa 15. Okt 2003 12:42

Re: Set Of ?
 
Du hast es erfaßt. 8) Wie wärs denn mal zur Abwechslung mit einer verketteten Liste ? :zwinker:

Christian Seehase 15. Okt 2003 13:02

Re: Set Of ?
 
Moin Jan,

Zitat:

Zitat von Jan
Da habe ich einen String, der exakt den gleichen Wert hat wie der Name eines Teils meines Sets, und ich soll nicht festellen kann, ob der Name in dem Set vorhanden ist?

Das klingt schon anders. Vorher sah es nach einem Set of Strings aus, und dass wäre wohl nur über eine Hashfunktion und grosse Lücken im Set, die dann mit Dummys gefüllt werden müssten machbar.

Dazu brauchst Du die Toolsapi (Standardmässig nicht im Suchpfad von Delphi enthalten).

Ich hatte auch mal ein Beispiel dazu.
Da muss ich aber erst einmal suchen, wo ich das hab'

[EDIT]
@Hansa:
Zitat:

Zitat von Hansa
Wie wärs denn mal zur Abwechslung mit einer verketteten Liste ? :zwinker:

Den Witz versteht aber nicht jeder :mrgreen:
[/EDIT]

Jan 15. Okt 2003 14:43

Re: Set Of ?
 
Zitat:

Den Witz versteht aber nicht jeder
Ich zum Beispiel nicht. :roll:

Zitat:

Dazu brauchst Du die Toolsapi (Standardmässig nicht im Suchpfad von Delphi enthalten).

Ich hatte auch mal ein Beispiel dazu.
Da muss ich aber erst einmal suchen, wo ich das hab'
Das klingt ja geradezu phantastisch, erzähl mir mehr :thuimb:
Gruß
Jan

Christian Seehase 15. Okt 2003 15:08

Re: Set Of ?
 
Moin Jan,

ich hab's gefunden:
Guckst Du hier:

12 Delphi Under The Hood: #09: How to Get an Enum's Name

Mit Toolsapi lag' ich weit daneben.
Die Unit heisst typinfo.
Es geht um die Verarbeitung der Run-Time TypeInformation (RTTI)

Jan 15. Okt 2003 18:36

Re: Set Of ?
 
Hallo Christian,
vielen Dank für deine Antwort,
aber du hast leider entweder meinen Post oder den Artikel nicht richtig gelesen.

Zitat:

It would be nice to be able to convert these enumerated types Red, Blue and Green to their string equivalent ('Red', 'Blue' and 'Green').
Stimmt, dass das so geht wie im text beschrieben, aber leider möchte ich das ganze andersrum. Nicht von Red nach 'red' sondern von 'red' nach red.
Gruß
Jan

Christian Seehase 15. Okt 2003 19:10

Re: Set Of ?
 
Moin Jan,

ja und? ;-)

Dann speichere Dir die ausgelesenen Strings in einer TStringList.
Anschliessend kannst Du dann mit IndexOf den Wert ermitteln.
Die Liste darf nur nicht sortiert sein.

Da in Delphi die Werte für die Aufzählungstypen bei 0 beginnen und Lückenlos aufeinander folgen, korrespondiert also der Index genau mit dem Wert.

Soll die Liste sortiert sein, kannst Du auch den Wert als Objekt zumsammen mit dem String speichern.

Hansa 15. Okt 2003 19:52

Re: Set Of ?
 
Langsam glaube ich, es wird immer viel zu kompliziert gedacht, wobei ich mich mit einschließe.

Zitat:

Zitat von Jan
Hallo DP,
habe dazu noch eine Frage:
wie überprüfe ich ob ein String in einem set vorkommt?
Mein Set sieht so aus:
Delphi-Quellcode:
var nameset : set of (comment, name, id);
und dann muss ich 'comment' in dem set wiederfinden.
Gruß
Jan

1. Fragestellung also, comment soll gefunden werden. 8)

Zitat:

Da habe ich einen String, der exakt den gleichen Wert hat wie der Name eines Teils meines Sets, und ich soll nicht festellen können, ob der Name in dem Set vorhanden
2. Das ist schon präziser.

Du willst also nur wissen ob der Sring 'Comment' in Deinem Set ist, richtig ? Und dazu wolltest Du einfach :

Delphi-Quellcode:
if MeinString IN MeinSet
benutzen. Wie wäre es denn, wenn Du einfach alle diese Teilstrings statt in das Set zu packen, aneinanderreihst ?

statt so:

Delphi-Quellcode:
var nameset : set of (comment, name, id);
einfach ungefähr so :

Delphi-Quellcode:
const namestring : 'comment name id';
Dann bist Du doch schon fertig. Dann kriegst Du mit :

Delphi-Quellcode:
if pos (SuchString,namestring) <> 0;
raus, ob das Ding da drin ist oder nicht :!: Vermute mal, das ist für drei Strings einfach nicht kompliziert genug, um es so zu machen. :mrgreen:

Jan 15. Okt 2003 22:08

Re: Set Of ?
 
:shock: Wo er recht hat...
Ein wahrlich praktisch denkendes Köpfchen der gute Hansa!

@Christian, du magst vielleicht auch recht haben aber deine Version ist wohl bei weitem aufwändiger. Ich danke Dir allerdings trotzdem für deine aufschlussreichen comments, den Link fand ich sehr interressant.
Gruß
Jan

Hansa 15. Okt 2003 23:20

Re: Set Of ?
 
Zitat:

Zitat von Jan
:shock: Wo er recht hat...
Ein wahrlich praktisch denkendes Köpfchen der gute Hansa!
...

Aha, war das doch alles ? :shock: "Warum einfach, wenns auch kompliziert geht ?" tja, das war noch nie was für mich. Aber trotzdem rate ich noch jedem, der an einem Problem hängen bleibt, zu versuchen dieses irgendwie auf eine einfachere Stufe zu reduzieren und zu versuchen es mit den Mitteln zu lösen, die man wirklich sicher beherrscht. Geht das nicht, so fehlt eben Wissen, das man sich aneignen muß, z.B. hier.

negaH 16. Okt 2003 01:26

Re: Set Of ?
 
Es geht auch eleganter, wenn wir den Compiler zu Hilfe nehmen. Zu jedem deklarierten Typ werden durch den Compiler auch Typ Informationen in die EXE eingelinkt. Durch diese wird es möglich dynamisch zur Laufzeit Typen zu überprüfen oder sogar zu casten. Die Funktionen in Unit TypInfo.pas sind da sehr hilfreich. Nachfolgender Code "castet" eine beliebigen String in ein Mengenelement aus der Menge von TName.

Delphi-Quellcode:
uses TypInfo;

type // der Namen Typ + das set
  TName = (unknown, idiot, comment, name, id);
  TNames = set of TName;

function StrToName(const Value: String): TName;
// wandelt einen String in ein TName um
var
  I: Integer;
begin
  I := GetEnumValue(TypeInfo(TName), Value);
  if I = -1 then Result := unknown
    else Result := TName(I)
end;

function NameToStr(Value: TName): String;
// gibt den lesbaren Bezeichner eines Mengen Elemente zurück
begin
  Result := GetEnumName(TypeInfo(TName), Integer(Value));
end;

procedure Test;
var
  Name: TName;
begin
  Name := StrToName('comment');
  Writeln( NameToStr( Name ) );

  WriteLn( NameToStr( StrToName('ID') ) );
  WriteLn( NameToStr( StrToName('iD') ) );
  WriteLn( NameToStr( StrToName('Comment') ) );
  WriteLn( NameToStr( StrToName('Test') ) );

  if StrToName('id') in [id, comment] then WriteLn('id is in [id, comment]')
    else WriteLn('id is not in [id, comment]');

  if StrToName('Test') in [id, comment] then WriteLn('Test is in [id, comment]')
    else WriteLn('Test is not in [id, comment]')
end;
Da auch Strings an StrToName() übergeben werden können die nicht in TName vorkommen habe ich das Element "unknown" deklariert. Alle Strings die nicht in TName vorkommen werden als unknown definiert.

Interessant wird es jetzt mit "idiot" denn mit Hansas Vorschlag würde eine solche Doppeldeutigkeit zu Fehlern führen. Da eben "id" auch in "idiot" vorkommt.

Gruß Hagen

Jan 16. Okt 2003 07:21

Re: Set Of ?
 
Grüß Dich Hagen,

Delphi-Quellcode:
function StrToName(const Value: String): TName;
// wandelt einen String in ein TName um
var
  I: Integer;
begin
  I := GetEnumValue(TypeInfo(TName), Value);
  if I = -1 then Result := unknown
    else Result := TName(I)
end;
Das ist doch fast genau was ich von Anfang an haben wollte!
Es wandelt zwar nicht jeden beliebigen String in einen TName mit selbigem Wert um, aber immerhin tut es das was ich brauche. Kann mir denn mal jemand sagen warum es die function strtoname, mit der man jeden beliebigen String umwandeln kann, nicht von vornherein bei Delphi gibt?
Danke Dir!
Gruß
Jan

negaH 16. Okt 2003 13:10

Re: Set Of ?
 
Zitat:

mit der man jeden beliebigen String umwandeln kann, nicht von vornherein bei Delphi gibt?
Die Antwort ist ziemlich einfach: diese Funktionen nutzen statische Typ Deklarationen die zur Entwurfszeit der RTL überhaupt nicht bekannt waren. Sprich die Entwickler bei Borland kannten den Typ TName überhaupt nicht, wie sollen sie dann darauf reagieren ??

Die allgemeine Funktion in deinem Falle ist aber GetEnumValue() und GetEnumName() und TypeInfo(). Die Funktionen StrToName() und NameToStr() sind nur Funktionen die speziell auf den Typ TName abgestimmt wurden, und die generellen Funktionen kapseln.

Somit haben die Borlandentwickler genau das getan was du verlangtest, aber eben universell auf jeden möglichen zukünftigen Typ anwendbar.

Gruß Hagen

Hansa 17. Okt 2003 10:44

Re: Set Of ?
 
Zitat:

Zitat von negaH
...Interessant wird es jetzt mit "idiot" denn mit Hansas Vorschlag würde eine solche Doppeldeutigkeit zu Fehlern führen. Da eben "id" auch in "idiot" vorkommt.

Hatte das schon im Beitrag stehen (ohne Idiot) 8) und wieder gelöscht:

Delphi-Quellcode:
const namestring : ' comment name id idiot ';
Man beachte die Leerzeichen. Denn hiermit wäre der Idiot unschädlich gemacht. :mrgreen: Die Suchabfrage müßte natürlich auch noch geändert werden:

Delphi-Quellcode:
if pos (' ' + SuchString + ' ',namestring) <> 0;

negaH 17. Okt 2003 13:33

Re: Set Of ?
 
:) @Hansa, darauf habe ich schon gewartet ;) Trotzdem habe ich die Erfahrung gemacht das dies schief gehen kann, wenn der Programmierer selber diese Leerzeichen setzen muß. Es wurde vergessen oder der String selber wurde nicht ge'Trim()t.

Gruß Hagen

Hansa 17. Okt 2003 18:30

Re: Set Of ?
 
Zitat:

Zitat von negaH
:) @Hansa, darauf habe ich schon gewartet ;) Trotzdem habe ich die Erfahrung gemacht das dies schief gehen kann, wenn der Programmierer selber diese Leerzeichen setzen muß...

hehe, darauf gewartet. :mrgreen: War doch klar. 8) Jan hat gesagt, er beschäftige sich jetzt mal mit Typen. Natürlich kann er Deinen Code abkupfern und versteht ihn nicht richtig. Nach dem Motto: "es funktioniert und keiner weiß warum". Der Code ist übrigens in meiner privaten CodeLib gelandet, aber nicht für solche Fragen, wie hier.

Desweiteren sage ich nur PROCEDURE

Jan 17. Okt 2003 20:28

Re: Set Of ?
 
Zitat:

Zitat von Hansa
Jan hat gesagt, er beschäftige sich jetzt mal mit Typen. Natürlich kann er Deinen Code abkupfern und versteht ihn nicht richtig. Nach dem Motto: "es funktioniert und keiner weiß warum".

Hallo Hansa,
nein ich beschäftige mich nicht mit Typen, weil ich nicht schwul bin! :roteyes:
Ausserdem verstehe ich sehr wohl was der Quelltext soll, und auch wie er funktioniert, weil ich mir die Typinfo unit angeguckt habe.
Gruß
Jan

Pseudemys Nelsoni 23. Okt 2003 16:59

Re: Set Of ?
 
ok, noch eine frage zu "Set Of"


wozu muss ich ein "Set" erstellen? kann ich nicht einfach einen aufzählungstyp checken? also z.b:

Delphi-Quellcode:
Type Tbla = (a,b,c,d,e,f)
var
  bla: TBla;
begin
  if (b in bla) then
  ShowMessage('jo')
end;

^^^^^^^^wieso kann ich nicht so prüfen ob ein bestimmter wert enthalten ist?

wieso muss ichs so machen?...

Delphi-Quellcode:
Type Tbla = (a,b,c,d,e,f)
Tirgendwas = Set Of Tbla;
var
  irgendwas: Tirgendwas;
begin
  if (b in irgendwas) then
  ShowMessage('jo')
end;
:gruebel:

Christian Seehase 23. Okt 2003 17:20

Re: Set Of ?
 
Moin Silent,

im ersten Falle ist bla vom Typ einer Aufzählung. Hier kannst Du nur auf Gleicheit prüfen (gleich einen Element der Aufzählung)
Im Zweiten Falle ist bla vom Typ einer Menge, also sozusagen, array of Aufzählung, und Du kannst prüfen, ob der gesuchte Wert darin enthalten ist.

Übrigens fehlt jeweils die Initialisierung von bla bzw. irgendwas, der Inhalt wäre also wohl zufällig.

Phoenix 23. Okt 2003 17:21

Re: Set Of ?
 
Hrm? Die "TypInfo" kannst Du Dir bei Deinem D7 aber nicht angeguckt haben. Da heisst die Unit nämlich "Types".

Das weiss ich auch eigener leidlicher Erfahrung mit der RTTI und verschiedenen Delphi-Versionen *seufz*.


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