Autor |
Beitrag |
fritz_07
      
Beiträge: 21
|
Verfasst: Di 01.06.10 23:21
Hallo an alle,
komme mal wieder nicht weiter.
Folgendes Problem:
Ich habe eine Variable Inhalt vom Typ String,dieser wird über ein Edit-Fenster ein Pfad zugewiesen.
Dann eine zweite Variable,die den zu suchenden Verzeichnisnamen enthält.Beide Stringwerte ändern sich hin und wieder.
Nun möchte ich überprüfen,ob in dem Pfad der Verzeichnisname vorkommt.
Eine geeignete Funktion,wäre z.B. die ContainsText,da beim Vergleich die Groß,-und Kleinschreibung nicht beachtet wird.
Diese Funktion erwartet aber eine const (laut Funktionsbeschreibung) und const sind doch nicht änderbar???
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Button1.Click(Sender : TObject); var Inhalt, Suche : String,
begin
Inhalt := Edit1.Text; Suche := Edit2.Text;
If ContainsText() then end; |
Gruß fritz_07 Moderiert von Narses: Topic aus VCL (Visual Component Library) verschoben am Di 01.06.2010 um 23:22
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 01.06.10 23:23
Moin!
In diesem Fall bedeutet das const etwas anderes: der Parameter wird in der Funktion nicht verändert (aber intern als Referenz weitergegeben, was ressourcenschonender ist).
Also, einfach mal ausprobieren!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
fritz_07 
      
Beiträge: 21
|
Verfasst: Fr 04.06.10 23:50
Hallo Narses,
ich habe es ausprobiert und muß sagen,es funktioniert.
Warum verwendet man dann in der Funktionsdeklaration const,wenn er als solches nicht verwendet wird?
Bezieht sich das nur auf diesen Fall???
Zitat: |
In diesem Fall bedeutet das const etwas anderes: der Parameter wird in der Funktion nicht verändert (aber intern als Referenz weitergegeben, was ressourcenschonender ist).
|
Wie sieht eigenlich ein Zeiger auf eine const aus?
Bitte ein Beispiel.
Gruß fritz_07
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.06.10 23:57
Das const bei einer Variablendeklaration hat mit dem const bei Parametern nichts zu tun. Bei Parametern legt es fest, wie die Parameter übergeben werden, ob by value (const) oder by reference (var).
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 05.06.10 00:03
Hey,
wie Narses schon sagte, da wird der Zeiger auf die Variable weitergegeben, um Ressourcen zu sparen. Und das ist bei allen Prozeduren/Funktionen so, bei denen die Paramerter als Konstante übergeben werden. Einen Zeiger auf eine Konstante gibts es eig. nicht, aber bei der Prozedur/Funktion ist das ja auch keine echte Konstante, sondern ein Zeiger auf eine Variable, bei der aber der Compiler das schreiben verbietet, wenn ich das richtig verstanden habe. So genau hab ich mich mit dem Thema noch nicht beschäftigt^^
€ @Luckie: Narses hat doch geschrieben, das bei const die Referenz übergeben wird, um Resourcen zu sparen. Kann es sein das du da was verwechselst? Weil CallByValue is ja einfach procedure Test(Value: Integer);
also ohne constoder var.
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.06.10 00:21
by value bedeutet, dass eine Kopie des Wertes der Variablen übergeben wird. by refernece wird ein Zeiger auf den Speicherplatz übergeben.
Und ich glaube, ich habe mich geirrt.
var: by reference, es wird ein Zeiger auf die Speicherstelle übergeben, der Parameter kann in der Prozedur geändert werden und das wirkt sich auf den Wert der Speicherstelle aus.
const: by value, der Parameter wird als Kopie übergeben und kann nicht geändert werden.
gar nichts: Der Parameter wird als Kopie übergeben und kann geändert werden, aber das wirkt sich nicht auf den Wert der Speicherstelle aus.
So sollte es passen.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 05.06.10 01:19
Gilt aber nur wenn die Variablen keine Objekte sind. In diesem Fall werden sie immer als Referenz übergeben.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.06.10 01:34
Richtig. Danke, für die Ergänzung. Ich glaube, dann hätten wir es jetzt zusammen.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 05.06.10 01:59
Hey,
Narses hat folgendes geschrieben : | In diesem Fall bedeutet das const etwas anderes: der Parameter wird in der Funktion nicht verändert (aber intern als Referenz weitergegeben, was ressourcenschonender ist). |
Luckie hat folgendes geschrieben : | const: by value, der Parameter wird als Kopie übergeben und kann nicht geändert werden. |
Das steht jetz aber noch im Weiderspruch^^
also sllte es vlt so lauten: const: by Referenz, es wird ein Zeiger auf die Variable übergeben, aber der Speicherplatz darf nicht geschrieben werden.
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.06.10 02:13
Wo ist bei den von dir zitierten Aussagen ein Widerspruch? Beide Aussagen beziehen sich auf unterschiedliche Dinge. Narses redet von const und ich von var. Das Delphi intern nur eine Referenz übergibt bei const, aus Optimierungsgründen, ändert nichts am Sachverhalt.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 05.06.10 02:20
Hä? du hast doch ein von const gesprochen? Und wenn eine Referenz übergeben wird (auch wenns nur intern is), dann ist es doch nich mehr ByValue. Oder steh ich grad auf'm Schlauch?!^^
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.06.10 03:12
Richtig, dann ist es genau genommen nicht mehr by value. Aber du musst unterscheiden, was der Programmierer "sieht" und was Delphi intern macht. Für den Programmierer ist es by value für den Compiler by reference.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 05.06.10 03:55
Ja, das meinte ich^^ Da hättmer ja jetz alles geklärt 
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Sa 05.06.10 11:17
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 05.06.10 11:20
Nein, Zeiger ist Zeiger in diesem Fall. Nur Delphi lässt es nicht zu, dass du das Argument wieder zurück gibst, wenn du das Argument nicht als var deklarierst.
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Sa 05.06.10 12:01
Das interessant ist aber doch wohin zeigt der Zeiger, direkt auf das Objekt oder auf eine Variable, die einen Zeiger auf ein Objekt enthält.
Delphi macht keine gesonderte Behandlung der Objekt Variablen, es wird auch dort genauso ein call by value oder by reference gemacht.
Dies kann man auch im Assembler sehen, im einen Fall wird der Wert übergeben (MOV) und im anderen die Adresse (LEA)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure MakeObject(var AObject: TObject); begin AObject:= TObject.Create; end;
procedure MakeInteger(var AInteger: Integer); begin AInteger := 5; end; |
Hier die Aufrufe mit Call by Value:
Quelltext 1: 2: 3: 4: 5: 6:
| Unit17.pas.43: MakeObject(AObject); 004B331A 8B45F8 mov eax,[ebp-$08] 004B331D E8B2FFFFFF call MakeObject Unit17.pas.44: MakeInteger(AInteger); 004B3322 8B45F4 mov eax,[ebp-$0c] 004B3325 E8C6FFFFFF call MakeInteger |
Und hier als Call by Reference:
Quelltext 1: 2: 3: 4: 5: 6:
| Unit17.pas.43: MakeObject(AObject); 004B3322 8D45F8 lea eax,[ebp-$08] 004B3325 E8AAFFFFFF call MakeObject Unit17.pas.44: MakeInteger(AInteger); 004B332A 8D45F4 lea eax,[ebp-$0c] 004B332D E8C2FFFFFF call MakeInteger |
|
|
fritz_07 
      
Beiträge: 21
|
Verfasst: Di 08.06.10 23:12
Hallo an alle,
danke für die ausführlichen Erklärungen.
Ich hätte noch eine Zusatzfrage zu meinem Problem:
Also, der Vergleich über die Funktion ContainsText() funktioniert gut.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var Inhalt, Suche : String,
begin
Inhalt := Edit1.Text; Suche := Edit2.Text; |
Wie müßte ich die Funktion abändern,das nur nach dem Wort "Verzeichnis" gesucht wird,egal an welcher Stelle im Pfad das Wort steht.
Folglich, müßte dann beim Vergleich mit "Verzeichnisse" eine Fehlermeldung erscheinen,da dieses Wort ja länger ist.
Ich hoffe, ich konnte es einigermaßen beschreiben.
Gruß fritz_07
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 08.06.10 23:22
Hallo,
da in einem Pfad gesucht werden soll kannst du doch nach '\Verzeichnis\' suchen.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
fritz_07 
      
Beiträge: 21
|
Verfasst: Mi 09.06.10 22:40
Hallo Lannes,
deine Idee ist nicht schlecht,nur wenn '\Verzeichnis\' am Ende vom Pfad steht,fehlt der backslash.
Dann bekomme ich eine Fehlermeldung.
Würde sich diese Funktion besser eignen???
Delphi-Quelltext 1:
| function PosEx(SubStr: string, S: string, Offset: Integer): Integer; |
Gruß fritz_07
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 09.06.10 22:54
Moin!
fritz_07 hat folgendes geschrieben : | deine Idee ist nicht schlecht,nur wenn '\Verzeichnis\' am Ende vom Pfad steht,fehlt der backslash. |
Dann pack doch zum Suchen temporär einen Backslash dran.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|