Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Klatsch und Tratsch (https://www.delphipraxis.net/34-klatsch-und-tratsch/)
-   -   Aha Momente (https://www.delphipraxis.net/211519-aha-momente.html)

himitsu 27. Sep 2022 23:15

Aha Momente
 
Vor einer kurzen Weile hatte ich mir selber was Ähnliches gebaut.

Und gerade, auf der Suche nach was Anderem, über was gestolpert und dachte mir *na toll, jetzt*

Delphi-Referenz durchsuchenTPointerStream
https://quality.embarcadero.com/browse/RSP-21307


[edit]
opps
https://docwiki.embarcadero.com/Libr...TPointerStream

Dennis07 28. Sep 2022 13:57

AW: Aha Momente
 
Gibts inzwischen eigentlich einen generischen TStream<T>?

Neutral General 28. Sep 2022 14:28

AW: Aha Momente
 
Wie sollte ein generischer TStream<T> funktionieren?

jaenicke 28. Sep 2022 14:43

AW: Aha Momente
 
Das erinnert mich an das alte "file of" Konstrukt. Mit beliebigen generischen Typen würde das allerdings nicht funktionieren.

Die Idee verstehe ich durchaus, aber ich sehe keine Möglichkeit einer Umsetzung. Im Grunde wäre die Anforderung quasi ein ORM auf Streambasis...

Neutral General 28. Sep 2022 14:49

AW: Aha Momente
 
Die einzige Möglichkeit die ich sehe ist sowas:
Delphi-Quellcode:
IStreamable = interface
  procedure LoadFromStream(Stream: TStream);
  procedure SaveToStream(Stream: TStream);
end;

TStream<T: IStreamable> = class(TCustomMemoryStream)
  // ...
end;
Aber das hilft auch nicht soo viel.

himitsu 28. Sep 2022 14:51

AW: Aha Momente
 
Binäre Daten sind eh bissl blöd.
Wenn, dann vielleicht ein ORM um TReader/TWriter (zwar auch binär, aber inkl. Formatierungdaten und optional auch als Text-Version)

Aber dann vielleicht eher in Richtung BSON (binäres JSON) oder CompressedXML,
wobei man TReader (das was die DFMs im Delphi nutzen) auch als typsicherere Variante des JSON/BSON ansehen könnte.

Benmik 29. Sep 2022 10:48

AW: Aha Momente
 
Wofür ist ein TPointerStream nützlich?

himitsu 29. Sep 2022 11:20

AW: Aha Momente
 
Damit du mit den Methoden eines Streams, und Allem was Streams unterstützt, im Speicher von irgendwas Anderem rumwurschteln kannst.
Also du bekommst z.B. von einer API einen Buffer (x Bytes) und kannst direkt mit diesem Speicher (ohne umzukopieren) das dennoch als Stream verarbeiten.

Du kannst damit auch in einem anderen TMemoryStream/TBytesStream (in dessen Speicher oder "sicher" nur einem Teil davon) mit einem weiteren Stream arbeiten usw.
Das macht es Einfacher Dinge zu verschachteln und spart Arbeit/Speicher ... z.B. wenn in einem großen Stream mehrere Bilde drin stecken, dann auf den gewünschten Teil den PointerStream drauf und das dann an LoadFromStream von irgendwas, ohne vorher umzukopieren.

Neutral General 29. Sep 2022 11:51

AW: Aha Momente
 
Sowas hab ich 2010 programmiert und hier hochgeladen (TVirtualStream):
https://www.delphipraxis.net/113289-mapped-streams.html

Ist sogar in der JWSCL gelandet :)
https://sourceforge.net/p/jedi-apili...sclStreams.pas

Dennis07 29. Sep 2022 12:18

AW: Aha Momente
 
Zitat:

Zitat von jaenicke (Beitrag 1512613)
Das erinnert mich an das alte "file of" Konstrukt. Mit beliebigen generischen Typen würde das allerdings nicht funktionieren.

Die Idee verstehe ich durchaus, aber ich sehe keine Möglichkeit einer Umsetzung. Im Grunde wäre die Anforderung quasi ein ORM auf Streambasis...

Naja sowas gibt es ja u.a. in Sprachen wie Java. Wäre sicher auch in Delphi irgendwie möglich, oder nicht?

Neutral General 29. Sep 2022 12:21

AW: Aha Momente
 
Zitat:

Zitat von Dennis07 (Beitrag 1512678)
Zitat:

Zitat von jaenicke (Beitrag 1512613)
Das erinnert mich an das alte "file of" Konstrukt. Mit beliebigen generischen Typen würde das allerdings nicht funktionieren.

Die Idee verstehe ich durchaus, aber ich sehe keine Möglichkeit einer Umsetzung. Im Grunde wäre die Anforderung quasi ein ORM auf Streambasis...

Naja sowas gibt es ja u.a. in Sprachen wie Java. Wäre sicher auch in Delphi irgendwie möglich, oder nicht?

Ich bezweifle stark, dass es sowas in Java gibt. Nach JSON serialisieren - ja. Aber generisches binäres Speichern von Objekten kann ich mir nicht vorstellen.
Ich meine man könnte vllt. mit Reflection/RTTI was machen, aber ob da am Ende das rauskommt was man gerne hätte ist fraglich.

jaenicke 29. Sep 2022 12:49

AW: Aha Momente
 
Zitat:

Zitat von Dennis07 (Beitrag 1512678)
Naja sowas gibt es ja u.a. in Sprachen wie Java. Wäre sicher auch in Delphi irgendwie möglich, oder nicht?

Den Stream<T>, den es in Java gibt, kann man auch in Delphi umsetzen, ja, wenn auch nicht mit inline LINQ, allerdings hat das nichts mit den Streams zu tun, wie es sie in der Delphi-Welt gibt...

himitsu 29. Sep 2022 12:57

AW: Aha Momente
 
Gehen täte es schon, aber nicht "generell" für "alle" Datentypen.

Zitat:

LINQ
ginge auch, über OleVariants, nur da fehlt dann im Delphi wiederum die Codevervollständigung .... aber egal ... die funktioniert ja eh nie :stupid:

DataCool 29. Sep 2022 12:59

AW: Aha Momente
 
Hallo zusammen,

recht interessant finde ich in dem Zusammenhang:

Binary Json

Bson spec

Gretes Data

himitsu 29. Sep 2022 13:09

AW: Aha Momente
 
BJSON/BSON ist technisch schon ein bissl wie die DFM im Delphi

Ein Byte für den Typ und dann die Daten, also in den Daten steht drinne, wie man sie interpretiert.

Zitat:

Zitat von himitsu (Beitrag 1512617)
Binäre Daten sind eh bissl blöd.
Wenn, dann vielleicht ein ORM um TReader/TWriter (zwar auch binär, aber inkl. Formatierungdaten und optional auch als Text-Version)

Aber dann vielleicht eher in Richtung BSON (binäres JSON) oder CompressedXML,
wobei man TReader (das was die DFMs im Delphi nutzen) auch als typsicherere Variante des JSON/BSON ansehen könnte.


dummzeuch 29. Sep 2022 13:25

AW: Aha Momente
 
Im Buch "Algorithms and Data Structures" (von 2001, zweite Auflage von 2006) beschreibt Julian Bucknall ein sich selbst dokumentierendes Dateiformat. Das ist ein File of Records, welches zusätzlich einen Header enthält, der den Record beschreibt. Wenn man die Struktur dieses Headers kennt, kann man einen generischen Reader dafür schreiben (und theoretisch auch einen Editor)

In der Firma benutzen wir ein auf dieser Idee basierendes Dateiformat, welches noch zusätzliche Angaben zur Datei und außerdem eine Prüfsumme im Header enthält. Das ist extrem praktisch, da unser Reader dafür beliebige unserer Datendateien anzeigen und auch grafisch darstellen kann.

Hauptvorteil: Durch binäres Format deutlich kleinere Dateien als in irgendwelchen Textformaten.

himitsu 29. Sep 2022 13:30

AW: Aha Momente
 
Jo, kleiner, aber vorallem auch schneller/einfacher zu lesen, weil man nichts erst parsen muß, bzw. auch Fehlerunanfälliger (besonders, wenn auch noch inkl. Prüfsumme).

Binäre-DFM, BSON, CompressedXML, ...
Text-DFM, JSON, XML, ...

jaenicke 29. Sep 2022 13:31

AW: Aha Momente
 
Zitat:

Zitat von dummzeuch (Beitrag 1512685)
Im Buch "Algorithms and Data Structures" (von 2001, zweite Auflage von 2006) beschreibt Julian Bucknall ein sich selbst dokumentierendes Dateiformat. Das ist ein File of Records, welches zusätzlich einen Header enthält, der den Record beschreibt. Wenn man die Struktur dieses Headers kennt, kann man einen generischen Reader dafür schreiben (und theoretisch auch einen Editor)

DBase? :-D

Ja, ich habe so etwas auch schon selbst geschrieben, aber damals kannte ich Datenbanken, z.B. eben auch einfache dateibasierte Datenbanken, noch nicht. Die machen ja genau das, was du dort beschrieben hast (ja, ohne Unterstrukturen, ich weiß). Und darauf aufsetzende ORMs können dann auch damit arbeiten.

Uwe Raabe 29. Sep 2022 13:47

AW: Aha Momente
 
Zitat:

Zitat von jaenicke (Beitrag 1512687)
DBase? :-D

War auch mein erster Gedanke :)

dummzeuch 29. Sep 2022 15:18

AW: Aha Momente
 
Zitat:

Zitat von jaenicke (Beitrag 1512687)
Zitat:

Zitat von dummzeuch (Beitrag 1512685)
Im Buch "Algorithms and Data Structures" (von 2001, zweite Auflage von 2006) beschreibt Julian Bucknall ein sich selbst dokumentierendes Dateiformat. Das ist ein File of Records, welches zusätzlich einen Header enthält, der den Record beschreibt. Wenn man die Struktur dieses Headers kennt, kann man einen generischen Reader dafür schreiben (und theoretisch auch einen Editor)

DBase? :-D

Ja, ich habe so etwas auch schon selbst geschrieben, aber damals kannte ich Datenbanken, z.B. eben auch einfache dateibasierte Datenbanken, noch nicht. Die machen ja genau das, was du dort beschrieben hast (ja, ohne Unterstrukturen, ich weiß). Und darauf aufsetzende ORMs können dann auch damit arbeiten.

DBase ist beim Schreiben um ein Vielfaches langsamer als dieses Format, das habe ich längst durchexerziert. Und auf diese Geschwindigkeit kommt es bei der Anwendung an. Beim Lesen ist es auch schneller, aber das wäre nicht so kritisch.

jaenicke 29. Sep 2022 16:05

AW: Aha Momente
 
Ja, das stimmt. Meine Variante war auch sehr schnell.

Uwe Raabe 29. Sep 2022 16:13

AW: Aha Momente
 
Zitat:

Zitat von dummzeuch (Beitrag 1512694)
DBase ist beim Schreiben um ein Vielfaches langsamer als dieses Format

Das war auch nicht damit gemeint. dBase hat nur einen ähnlichen Dateiaufbau:
Zitat:

Zitat von dummzeuch (Beitrag 1512685)
Das ist ein File of Records, welches zusätzlich einen Header enthält, der den Record beschreibt.


himitsu 1. Okt 2022 14:08

AW: Aha Momente
 
Ein schönes Aha ist toll,
aber es geht auch andersrum. :cry:

https://quality.embarcadero.com/browse/RSP-39576
Je öfter man drauf guckt, um so schlimmer wird es.

Ich guck heute lieber nicht mehr in meine eigenen Codes.

Hatte bestimmt zu oft in der Hilfe abgeguckt. :freak:

Redeemer 5. Okt 2022 16:20

AW: Aha Momente
 
Hatte auch gerade einen Aha-Moment und bin immer noch völlig irritiert, weil man
Delphi-Quellcode:
function Wupp(Di: array of Integer): string;
auch mit einem Integer als Argument aufrufen kann, sofern es sich bei dem Integer nicht um ein Literal handelt.

Delphi-Quellcode:
function Wupp(Di: array of Integer);
begin
  Result := Wupp(Di[0]);
end;
Kompiliert (und führt zu einem Stapelüberlauf, sofern keine überladene Version für
Delphi-Quellcode:
Di: Integer
existiert).

Welchen Sinn hat das?

Uwe Raabe 5. Okt 2022 16:27

AW: Aha Momente
 
Über den Sinn zu diskutieren ist müßig.

Zumindest ist es dokumentiert:
Zitat:

Instead of an array, you can pass a variable of the open array parameter's base type. It will be treated as an array of length 1.

Redeemer 5. Okt 2022 17:01

AW: Aha Momente
 
Danke, den Artikel der Hilfe hatte ich irgendwie nicht gefunden. Hatte nach "Argumente" und nach "Methoden" gesucht.

himitsu 5. Okt 2022 17:09

AW: Aha Momente
 
Ich finde es nur nervig, wenn der Compiler immer wieder ein [1,2,3,...] als Enum interpretiert, obwohl er merken müsste, dass links vom := oder als Zieltyp des Parameters oder Operators ein Array vorgegeben ist.
Bzw. das er bei zu großen oder kleinen (negativen) Werten nicht von selber auf die Idee kommt es mal mit einem Array statt Enum zu versuchen, wo er Einem ja nur noch ein "out of range" um die Ohren werfen kann/tut.

Dass man das [] beim Aufruf weglassen kann ... Ohhh, wusste ich noch garnicht. machte mir immer die Mühe und schereibe die [ ] drumrum und verschwendete so bisher massenhafft Festplattenspeicher. :cry:

Redeemer 5. Okt 2022 17:15

AW: Aha Momente
 
Mich stört im Zusammenhang mit Enums eher, dass wie oben erwähnt Bezeichner in offene Arrays konvertiert werden, Enums aber nicht in Sets. Zum einen als Methodenparameter, zum andere beim Plus-Operator: Set + Enum geht nicht, es muss Set + Set heißen.

himitsu 5. Okt 2022 17:24

AW: Aha Momente
 
Ja, da hätte man den Operator überladen können, mit SET und ENUM.
Im Gegenzug kann man beim Include nur Einen aber nicht mehrere ENUMs verwenden. :stupid::lol:

Ich weiß nicht, ob man einen Record-Helper auch um Operatoren erweitern kann, um es selber zu machen.

Beim Array machen sie die [ implizit drum,
warum dann nicht auch bei + :?:



Ich wollte noch einen Feature-Request machen, dass der Compiler Type/Enum-Namespaces implizit einbezieht/bevorzugt.
Wenn der Compiler und CodeCompletion in einer Zuweisung := oder als Zieltyp für Paramerter und Property einen Enum/Set erkennt, warum kann er dann nicht diesen Typ als erstes in der Suchreihenfolge haben, auch implizit für ScopedEnums ... bzw. eigentlich für alle Typen, nicht nur Enums.

Amateurprofi 6. Okt 2022 18:29

AW: Aha Momente
 
Hatte kürzlich in einer (dynamisch erzeugten Form) ein THeaderControl eingefügt mit
Delphi-Quellcode:
fHeaderControl := THeaderControl.Create(Self);
Als ich dann das HeaderControl an eine bestimmte Position stellen wollte
Delphi-Quellcode:
fHeaderControl.SetBounds(L, T, W, H)
funktionierte das nicht.
Die Höhe wurde gesetzt, Left, Top, Width blieben unverändert.
Auch der Versuch, alle Parameter separat zu setzen, brachten das gleiche Resultat.
Hab dann einen längeren Thread verfasst, um Hilfe zu kriegen.
Gerade als ich "Thema erstellen" klicken wollte, erinnerte ich mich daran, dass ich mich immer geärgert hatte, wenn ich in der IDE ein HeaderControl in ein Formular eingefügt hatte, dieses am oberen Rand der Form erschien, weil Align defaultmäßig auf alTop gesetzt wird.
Ein
Delphi-Quellcode:
Align := alNone;
löste das Problem.
"Aha Moment".

Uwe Raabe 6. Okt 2022 21:51

AW: Aha Momente
 
Zitat:

Zitat von Amateurprofi (Beitrag 1512914)
wenn ich in der IDE ein HeaderControl in ein Formular eingefügt hatte, dieses am oberen Rand der Form erschien, weil Align defaultmäßig auf alTop gesetzt wird.

Na ja, es heißt ja nicht von ungefähr THeaderControl. Ähnlich wie sein Counterpart TStatusBar, was standardmäßig Align = alBottom hat. Ein weiteres Mitglied der Familie ist übrigens TSplitView, wo man lediglich zwischen alLeft und alRight wählen kann, gut versteckt im Property Placement.

Amateurprofi 7. Okt 2022 16:56

AW: Aha Momente
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1512919)
Zitat:

Zitat von Amateurprofi (Beitrag 1512914)
wenn ich in der IDE ein HeaderControl in ein Formular eingefügt hatte, dieses am oberen Rand der Form erschien, weil Align defaultmäßig auf alTop gesetzt wird.

Na ja, es heißt ja nicht von ungefähr THeaderControl. Ähnlich wie sein Counterpart TStatusBar, was standardmäßig Align = alBottom hat. Ein weiteres Mitglied der Familie ist übrigens TSplitView, wo man lediglich zwischen alLeft und alRight wählen kann, gut versteckt im Property Placement.


Ja, ist (und war) mir schon klar.
Bei TStatusBar finde ich das auch gut so, auch wenn ich schon Projekte mit 2 StatusBars hatte, eine oben und die andere unten.
Aber ein HeaderControl wird ja i.d.R. im Zusammenhang mit ListBoxen verwendet, und die reichen ja auch defaultmäßig nicht von Rand zu Rand.
Ich wollte mit meinem Beitrag auch keine Kritik üben, sondern lediglich einen "Aha Moment" (Titel des Threads) schildern.

himitsu 7. Okt 2022 17:39

AW: Aha Momente
 
Manchmal steht man einfach auf dem Schlauch.

Im FMX letztens ein Memo alBottom in den WebBrowser gelegt, anstatt darunter und mich dann gewundert, dass es zur Laufzeit nicht sichtbar ist.

So, hatte meine Dashboards und Filter im Jira endlich mal bissl überarbeitet
und dachte auch erst "maaaa, warum geht das denn nicht" ... schon das halbe Internet durchsucht ... und am Ende einfach übersehn, dass dort nur ein winziges Häkchen fehlte, die Sortierung falschrum war, aber der Filter doch richtig funktionierte. :wall:

Aha da sind sie ja, die Spammer Markus, Stefan, Uwe und der Kein :lol:



Funktioniert meine neue angefangene Wunschliste denn?

Uwe, wie bekommst du denn 3 Zeilen hin?
schon seit Jahren fängt die bei mir schon ab mehr als 2 Zeilen an zu meckern, dass maximal 3 gehen. :freak:

Uwe Raabe 7. Okt 2022 17:55

AW: Aha Momente
 
Zitat:

Zitat von himitsu (Beitrag 1512963)
Uwe, wie bekommst du denn 3 Zeilen hin?

Was meinst du?

himitsu 7. Okt 2022 17:57

AW: Aha Momente
 
deine Signatur :lol:

Uwe Raabe 7. Okt 2022 18:02

AW: Aha Momente
 
Habe ich einfach so eingegeben..

himitsu 15. Okt 2022 15:41

AW: Aha Momente
 
Liste der Anhänge anzeigen (Anzahl: 1)
:cry: bei mir meckert es immer, wenn mehr als 2 Zeilen.


Manchmal sind es eher aaaaarrrrrrrrrrggggggg-Momonente

erst hängt man in einer "neuen" API fest ... wo es kaum und oft falsche Dokumentenation/Beispiele gibt
und nun wo es langsam läuft ... an einigen Stellen macht selbst schon Windows 10 was anderes, als die Win10 Doku sagt (will noch garnicht an doe 11 denken)
und dann eben immer wieder so Zeugs, mit neuen "coolen" Einstellungen und falschen Typen, wo es dann ab und an mal unverhofft knallt

https://quality.embarcadero.com/brow...comment-124445
oder siehe hier der Screenshotthread, mit den Überlaufexceptions. :freak:



https://www.facebook.com/googlecloud/photos/a.498496087218638/1466800933721477/?type=3
eigentlich hatte ich diese zerknautschte arrg-schwarz-weiß-gesichstsstrichzeichnung gesucht ... ihr kennt die bestimmt, aber fand sie nicht mehr

Uwe Raabe 15. Okt 2022 18:41

AW: Aha Momente
 
Zitat:

Zitat von himitsu (Beitrag 1513346)
:cry: bei mir meckert es immer, wenn mehr als 2 Zeilen.

Lass mal den Zeilenvorschub am Ende der dritten Zeile weg.

himitsu 22. Nov 2022 19:14

AW: Aha Momente
 
nja, hatte schon vieles probiert ... nix half :cry:



alljährliches hohoho hahaha

https://www.kaufland.de/product/300851894/
schnell kaufen ... ist heute einen Euro günster, als wie letzte Woche.
Bei Amazon-BFW leider verpasst ... kurz vor Mitternacht geguckt und plötzlich war's teurer :cry: ... da waren es mal wirklich fast 20% unterm Preis, was Idealo zum letzten Jahr zu sagte.


Nja, wie war das letztens im Saturn-Werbespot?
bis 60 Prozent Rabat ... bla bla bla

Ja nee, wer's glaubt, wird seelig.
Prozente gegen die UVP, aber der Preis immernoch höher, als wie vor der Black Friday Week, bzw. wie der durchschnittliche Preis im letzten halben Jahr. :freak:

Sinspin 23. Nov 2022 06:23

AW: Aha Momente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Aha-Moment ist bei bisher bei mir ausgeblieben. Da musst du mir mal helfen. Der kommt erst wenn ich verstanden habe wie man für eine altmodische MAUS (nur ansersrum) mit Ball der immer verdreckt 587€ ausgeben kann!

Anhang 55604


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:05 Uhr.
Seite 1 von 2  1 2      

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