![]() |
Verantwortlichkeiten / Wer kümmert sich um Freigeben
Hallo, Ich habe eine Klasse der man Blöcke hinzufügt:
Delphi-Quellcode:
Wenn Ich jetzt eine Block übergebe enthält der Block ein IMG.
// Die Blöcke
TBlock = class(TPersistent) private FImage : TBitmap; // Die Klasse welche Blöcke hat TReportUnit = class(TPersistent) private FBlocks : TObjectList;
Delphi-Quellcode:
Dafür brauche Ich ja ein Bitmap
// von außen kann man nur die TReportUnit sehen und die hat AddBlock
ReportUnit.AddBlock('Hysterese Test 1', Bitmap1);
Delphi-Quellcode:
Ist Die Block Klasse für Das Img Verantworlich oder besser die Prozedur wos auch erstellt wurde?
Bitmap1 := TBitmap.Create;
Bitmap1.LoadFromFile('D:\platzhalter1.bmp'); ReportUnit.AddBlock('Hysterese Test 1', Bitmap1); // Dann mache Ich das Generate vom Report ReportUnit.Generate; // Dann gebe Ich die ReportUnit wieder frei ReportUnit.Free; // Was ist jetzt erwartet? // Bitmap1.Free; ? // Oder wird ab jetzt davon ausgegangen das im Block.Destroy; auch irgendwann // das Img von selbst freigegeben wird? Grüße. |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Jetzt wäre es hilfreich, den Code der Methode AddBlock zu kennen
|
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Und vorallem wie TObjectList erstellt wurde.
Ist OwnsObjects True oder False? |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
hi
warum wendest Du nicht dein Motto aus deiner Signatur an?
Delphi-Quellcode:
ReportUnit.AddBlock('Hysterese Test 1', 'D:\platzhalter1.bmp');
ReportUnit.Generate; ReportUnit.Free; das Bitmap wird in AddBlock erzeugt und kann von ReportUnit im Free entsorgt werden bzw. über OwnsObjects direkt von der Liste... Grüße |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Zitat:
Der, welcher etwas erstellt, der gibt es auch wieder frei. Und passend zum
Delphi-Quellcode:
gibt es dann noch die beiden anderen Gegenstücke.
ReportUnit.AddBlock('Hysterese Test 1', 'D:\platzhalter1.bmp');
- Der Report erzeigt das TBitmap, gibt es nach ausßen, wo man es befüllen kann und der Report gibt dieses am Ende wieder frei. - Das Bitmap wird extern erstellt, man gibt es an AddBlock. Der Report macht sich eine Kopie, mit der es arbeitet und die er dann wieder freigibt. und der, welcher erxtern das Bild erzeugte, gibt Seins selber frei. (wenn man für die Übergabe TGraphic nutzt, dann kan man dort auch noch Anderes, wie z.B. JPEG, PNG oder GIF übergeben) |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Zitat:
Wie willst du jetzt solch einen Report aus einem Zip Container oder einer DB ziehen, ohne die Bilder (wie es viele komplett hirnrissige Programme machen) in einen Temp-Ordner zu entpacken. IMHO, hätte man mit so einem Schritt die Komplexität der ganzen Geschichte um den Faktor 100 oder 1000 erhöht. @Jonas, In meinen Delphi-Tagen habe ich mich in solchen Situationen an die Konventionen gehalten, wie sie zum Beispiel von TObjectList vorgelebt[1] werden. AddBlock könnte einen optionalen Parameter haben, der festlegt, ob der Block den Speicher des Bildes verwaltet. Wenn Blöcke nur über die Factory in TReportUnit erzeugt werden können, wäre es IMO für jeden offensichtlich, dass die jeweilige ReportUnit die auch wieder tötet... Ein Overload, wie Lemmy in vorschlug, ist nätürlich sinnvoll (und dass in dem Moment der Block das Bild verwaltet auch). Aber Pfade dürfen nicht als einzige Option in einer API existieren, siehe meinen Einwand oben. [1] und damit von einem durchschnittlichen Delphi-Dev verstanden werden |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Zitat:
Aber im Grunde wieder ein schönes Beispiel dafür wie wichtig der Kontext eines Problems ist. Und deine Antwort ist ein schönes Beispiel für Leute, die nicht das Problem lösen, sondern gleich 5 weitere Probleme mit, die vielleicht irgend wann einmal in der Zukunft auftreten könnten und mit deren Lösung sie das ganze Thema aufblasen und kompliziert machen. Und um eines gleich vorweg zu nehmen: Deine beiden genannten Anforderungen lassen sich mit meiner Lösung umsetzen: nennt sich überladen einer Methode. Da kannst Du das Bild dann aus einem Zip-Container per Stream an das Objekt übergeben oder per DB-Feld oder sonst was - die Komplexität (BMP anlegen, verarbeiten, freigeben) jedenfalls bleibt in der Klasse versteckt. Und noch eines: Ja, es gibt sicherlich ca. 1 Mio Anforderungen und mögliche Situationen, die NICHT durch meinen Vorschlag abgedeckt werden. ;-) |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Bin wieder da.
@mkinzler
Delphi-Quellcode:
@himitsu
procedure TReportUnit.AddBlock(Text: String; Image: TBitmap);
var Block : TBlock; begin // block erstellen Block := TBlock.Create; // bild und text zuweisen Block.FImage := Image; Block.FText := Text; // block in Blockliste übernehmen FBlocks.Add(Block); end; Habe mir kurz angesehen was es macht. Super Sache, Ich hab alles mit einer For-Schleife freigegeben, wusste nicht das die Liste das kann. Hätte Ich mir mal genauer ansehen müssen. Jetzt:
Delphi-Quellcode:
@Lemmy
FBlocks.OwnsObjects := True;
Habe drüber nachgedacht aber einige der Bitmaps liegen nie als Pfad vor. @himitsu Das finde Ich glaube Ich am besten, also wird das Objekt beim Übergeben verdoppelt und Ich gebe es an beiden Orten wieder frei, das scheint wirklich das Beste. So ist aufjedenfall sichergestellt, dass das Bild von der Klasse gelöscht wird und wenn der User meiner Klasse nicht genau weiß was er machen soll würde sein Free aufjedenfall nicht mein Bild in der Klasse löschen auf welches Ich ja noch irgendwann später in der Klasse zugreife. :thumb: Damit wäre eigentlich alles geklärt. Wenn kopiert wird bleibt im schlimmsten Fall ein Bild im Speicher hängen aber das wird der Programmierer ja dann merken und (oder gleich) wie gewohnt seine Objekte auch wieder Freigeben. ThX |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Zitat:
>>> Bitte seinen Vorschlag um meinen Hinweis erweitern. Sein Vorschlg lief eben (nur) genau auf das gepostete Beispiel hinaus und dahingegen ist es einfacher ... vorallem speziell der Verantwotlichkeitsfrage. |
AW: Verantwortlichkeiten / Wer kümmert sich um Freigeben
Lemmy zur sicherheit poste Ich nochmal was Ich implementiert habe, vielleicht hab Ichs ja noch nicht ganz richtig gemacht:
Die API der TReportUnit bietet:
Delphi-Quellcode:
Der AddBlock macht jetzt folgendes:procedure AddBlock(Text : String; Image : TBitmap); procedure Generate;
Delphi-Quellcode:
Block.FImage.Assign(Image); ist wohl die wichtige Zeile hierbei.
procedure TReportUnit.AddBlock(Text: String; Image: TBitmap);
var Block : TBlock; begin // block erstellen Block := TBlock.Create; // bild und text KOPIEREN Block.FImage.Assign(Image); Block.FText := Text; // block in Blockliste übernehmen FBlocks.Add(Block); end; Und mit FBlocks.OwnsObjects := True; habe Ich eine kompfort Freigabemöglichkeit ;) und mein code im Aufruft sieht jetzt so aus:
Delphi-Quellcode:
function TTestActionMCOReport.Execute: TActionResult;
var ReportUnit : TReportUnit; Bitmap1 : TBitmap; begin ReportUnit := TReportUnit.Create; ReportUnit.TemplateFile := TTestActionMCOReportParam(Parameter).TemplateFileName; ReportUnit.PDFDokumentOutputPath := TTestActionMCOReportParam(Parameter).PDFDokumentOutputPath; // Hier müssen die Bilder welche dann auch im Report sein sollen mit AddBlock hinzugefügt werden Bitmap1 := TBitmap.Create; Bitmap1.LoadFromFile... // Oder Vielleicht kopiere Ich das Bitmap auch aus einem Stream oder DB oder wie auch immer ReportUnit.AddBlock('Hysterese Test 1', Bitmap1); Bitmap1.Free; // Erstes Freigeben weil Bild ja jetzt in Reportunit Existent ist ReportUnit.Generate; ReportUnit.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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