Hi Tom,
danke erstmal für den kleinen Exkurs. 80% mache ich davon ja schon, (in der Anfangszeit des Forum habe ich noch gar nichts kapiert in Sachen Codeblock. Da bin ich jetzt schon wesentlich weiter.) aber die Tiefe fehlt mir. Das Grundgerüst stand zwischendurch schon mal fest. Aber dann.....
Ich habe es im Forenindex und denke mal, mit jedem neuen Beispiel wird es besser nachzuvollziehen. Wozu sowas gut ist, dass habe ich verstanden, aber allein an der Umsetzung hapert es noch ein wenig. Aber wie immer:"man lernt täglich dazu"
Wobei ich mir jetzt aber dennoch die Frage stelle: "Hat das wirklich was mit detached locals zu tun?" Das kann ich irgendwie nicht miteinander verbinden.
DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21197
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9366
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
Hallo, Manfred.
Das kann ich nicht beantworten. "Detached Locals" sind nach meinem Verständnis lokale Variablen, die durch die Nutzung im Codeblock "gelöst" oder "distanziert" (kopiert?) werden. In diesem Beispiel - also in der Lösung für Dein Problem - wird aber nur der Wert der Variablen genutzt, nicht sie selbst (ich rede von "cNi"). Um ehrlich zu sein, weiß ich nicht so ganz genau, was der Begriff eigentlich genau bezeichnet, aber vielleicht kann das z.B. Martin beantworten.Wobei ich mir jetzt aber dennoch die Frage stelle: "Hat das wirklich was mit detached locals zu tun?" Das kann ich irgendwie nicht miteinander verbinden.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21197
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
Das wäre mir schon wichtig.
Ich hoffe nicht das Martin den Begriff "detached locals" in seinen Wortschatz übernommen hat, wie "da mache ich immer ein Array draus"..
Ich hoffe nicht das Martin den Begriff "detached locals" in seinen Wortschatz übernommen hat, wie "da mache ich immer ein Array draus"..
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
Moin,
also die Lösung wird ja nicht als detached local bezeichnet, sondern das ist die Ursache dafür, dass man so einen Weg gehen muss.
In dem Fall ist local auch sicherlich nicht im Sinne der Variablendefinition zu sehen (daher sicherlich auch euer Verständnisproblem: ich nutze keine local, in Makros kann man das eh' nicht )
Sondern local ist hier wortwörtlich zu übersetzen! Also örtlich losgelöst - wenn man es mit zwei Worten übersetzen müsste.
Muss man aber zum Glück nicht!
Länger erklärt bedeutet das im Prinzip nichts anderes, als was Tom vor zwei Postings erklärt hat: Das Nutzen einer Variablen, die zum Zeitpunkt des Nutzens nicht mehr den eigentlichen Wert enthält. Sie hat sich also gegenüber dem ursprünglich gewollten Wert (ungewollt) verändert. Weil Sie eben erst zu einem späteren Zeitpunkt wirklich ausgewertet wird und dann einen bereits geänderten Wert enthält!
Viele Grüße,
Martin
also die Lösung wird ja nicht als detached local bezeichnet, sondern das ist die Ursache dafür, dass man so einen Weg gehen muss.
In dem Fall ist local auch sicherlich nicht im Sinne der Variablendefinition zu sehen (daher sicherlich auch euer Verständnisproblem: ich nutze keine local, in Makros kann man das eh' nicht )
Sondern local ist hier wortwörtlich zu übersetzen! Also örtlich losgelöst - wenn man es mit zwei Worten übersetzen müsste.
Muss man aber zum Glück nicht!
Länger erklärt bedeutet das im Prinzip nichts anderes, als was Tom vor zwei Postings erklärt hat: Das Nutzen einer Variablen, die zum Zeitpunkt des Nutzens nicht mehr den eigentlichen Wert enthält. Sie hat sich also gegenüber dem ursprünglich gewollten Wert (ungewollt) verändert. Weil Sie eben erst zu einem späteren Zeitpunkt wirklich ausgewertet wird und dann einen bereits geänderten Wert enthält!
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21197
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
LOCAL verwirrt mich immer. Danke für den kleinen Schlag auf den Hinterkopf...
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9366
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]
Okay, in Deiner Lösung des Problems werden keine "detached Locals" verwendet. Auch wenn "cNi" lokal war, spielt das in diesem Zusammenhang keine Rolle, da der Wert genutzt wird. Die Variable ist später furzegal.
Dies ist ein Beispiel aus der Xbase++-Doku für "detached Locals":
Der Variablen bBlock wird gleich bei der Initialisierung das Ergebnis der Funktion "SaveCursor()" zugewiesen, und dieses Ergebnis besteht aus einem Codeblock, der auf lokale Variablen in dieser Funktion verweist - und zwar ohne Makroexpander und solchen Schnullibulli. Eigentlich sollte man meinen, dass "Eval(bBlock)" am Ende von "Main" scheitern müsste, weil der Codeblock ja Verweise auf Variablen enthält, die er nach bestem Dafürhalten nicht kennen dürfte. Tut er aber doch, weil sie "detached" sind - und zwar dadurch, dass sie in "SaveCursor" einem Codeblock zugewiesen werden. Das erklärt die Doku so:
LOCAL Variablen haben normalerweise die gleiche Lebensdauer wie die Funktion, in der sie deklariert wurden. Sie können aber auch nach Abschluß einer Funktion noch existieren, wenn sie innerhalb der deklarierenden Funktion in einen Codeblock eingebaut werden, der von der Funktion zurückgegeben wird. In diesem Fall existiert eine LOCAL Variable weiterhin innerhalb eines Codeblocks und ist losgelöst von der deklarierenden Funktion (detached local).
Dies ist ein Beispiel aus der Xbase++-Doku für "detached Locals":
Code: Alles auswählen
PROCEDURE Main
LOCAL bBlock := SaveCursor() // Position sichern
@ 10, 20 SAY "Cursor-Position ist geändert"
Eval( bBlock ) // Position restaurieren
RETURN
FUNCTION SaveCursor()
LOCAL nRow := Row() // LOCAL Variablen
LOCAL nCol := Col() // initialisieren
RETURN {|| SetPos( nRow, nCol ) } // In Codeblock einbauen und zurückgeben
LOCAL Variablen haben normalerweise die gleiche Lebensdauer wie die Funktion, in der sie deklariert wurden. Sie können aber auch nach Abschluß einer Funktion noch existieren, wenn sie innerhalb der deklarierenden Funktion in einen Codeblock eingebaut werden, der von der Funktion zurückgegeben wird. In diesem Fall existiert eine LOCAL Variable weiterhin innerhalb eines Codeblocks und ist losgelöst von der deklarierenden Funktion (detached local).
Herzlich,
Tom
Tom