![]() |
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:
im grossen und ganzen meine ich...wozu das "set of" ist und wozu man "Mengen" braucht?
var
irgendwas: irgendwas2; begin irgendwas := bla2; end; gibts irgendwie ein beispiel wo man soetwas braucht? |
Re: Set Of ?
Ein Set ist eine "Menge", z.B.:
Delphi-Quellcode:
jetzt kannst du schreiben:
var buchstaben : set of char;
Delphi-Quellcode:
Dann wären da (fast alle Buchstaben drin, aber keine Zahlen, äöü und andere Sonderzeichen. Wichtig wird eigentlich nur der Operator "IN"
buchstaben := ['a'..'z','A'..'Z'];
Mit z.B.:
Delphi-Quellcode:
läßt sich überprüfen, ob ch in der Menge der Buchstaben enthalten ist, oder nicht.
if ch IN buchstaben
|
Re: Set Of ?
danke hansa, das hilft mir schonmal weiter 8)
|
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:
und dann muss ich 'comment' in dem set wiederfinden.
var nameset : set of (comment, name, id);
Gruß Jan |
Re: Set Of ?
Da ein Set nicht aus Strings besteht, kannst Du auch nicht testen, ob ein String im Set vorkommt ;-)
...:cat:... |
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 |
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 |
Re: Set Of ?
Zitat:
Du mußt es eben anders machen. Viele Wege führen nach Rom. 8) |
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 |
Re: Set Of ?
Du hast es erfaßt. 8) Wie wärs denn mal zur Abwechslung mit einer verketteten Liste ? :zwinker:
|
Re: Set Of ?
Moin Jan,
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' [EDIT] @Hansa: Zitat:
[/EDIT] |
Re: Set Of ?
Zitat:
Zitat:
Gruß Jan |
Re: Set Of ?
Moin Jan,
ich hab's gefunden: Guckst Du hier: ![]() Mit Toolsapi lag' ich weit daneben. Die Unit heisst typinfo. Es geht um die Verarbeitung der Run-Time TypeInformation (RTTI) |
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:
Gruß Jan |
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. |
Re: Set Of ?
Langsam glaube ich, es wird immer viel zu kompliziert gedacht, wobei ich mich mit einschließe.
Zitat:
Zitat:
Du willst also nur wissen ob der Sring 'Comment' in Deinem Set ist, richtig ? Und dazu wolltest Du einfach :
Delphi-Quellcode:
benutzen. Wie wäre es denn, wenn Du einfach alle diese Teilstrings statt in das Set zu packen, aneinanderreihst ?
if MeinString IN MeinSet
statt so:
Delphi-Quellcode:
einfach ungefähr so :
var nameset : set of (comment, name, id);
Delphi-Quellcode:
Dann bist Du doch schon fertig. Dann kriegst Du mit :
const namestring : 'comment name id';
Delphi-Quellcode:
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:
if pos (SuchString,namestring) <> 0;
|
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 |
Re: Set Of ?
Zitat:
|
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:
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.
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; 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 |
Re: Set Of ?
Grüß Dich Hagen,
Delphi-Quellcode:
Das ist doch fast genau was ich von Anfang an haben wollte!
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; 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 |
Re: Set Of ?
Zitat:
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 |
Re: Set Of ?
Zitat:
Delphi-Quellcode:
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:
const namestring : ' comment name id idiot ';
Delphi-Quellcode:
if pos (' ' + SuchString + ' ',namestring) <> 0;
|
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 |
Re: Set Of ?
Zitat:
Desweiteren sage ich nur PROCEDURE |
Re: Set Of ?
Zitat:
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 |
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:
:gruebel:
Type Tbla = (a,b,c,d,e,f)
Tirgendwas = Set Of Tbla; var irgendwas: Tirgendwas; begin if (b in irgendwas) then ShowMessage('jo') end; |
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. |
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 21:29 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