DCBROWSCOL dynamisch erzeugen [ERLEDIGT]

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21193
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]

Beitrag von Manfred »

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.
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!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9363
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]

Beitrag von Tom »

Hallo, Manfred.
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.
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.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21193
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]

Beitrag von Manfred »

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".. :lol: :D :blob8:
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!!
Benutzeravatar
Martin Altmann
Foren-Administrator
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]

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21193
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]

Beitrag von Manfred »

#-o

LOCAL verwirrt mich immer. Danke für den kleinen Schlag auf den Hinterkopf... :violent1:
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!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9363
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCBROWSCOL dynamisch erzeugen [ERLEDIGT]

Beitrag von Tom »

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":

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
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).
Herzlich,
Tom
Antworten