AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Offenes Array oder Set als Parameter

Offenes Array oder Set als Parameter

Ein Thema von Schwedenbitter · begonnen am 26. Apr 2016 · letzter Beitrag vom 26. Apr 2016
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 09:52
Hallo,

mein Programm scannt Seiten ein und filtert die leeren Seiten aus. Das erledige ich über das Zählen der Pixel <> weiß und es funktioniert ziemlich gut. Leider gibt es (zumeist) Behörden, die ärgern mich damit, dass sie auch leere Seite mit Strich- oder Barcodes versehen. Diese sind aber glücklicher Weise immer an denselben Stellen.
Mein Plan ist nun, vor dem Zählen der farbigen Pixel einfach ein bzw. mehrere weiße Vierecke über diese Codes zu legen. Dazu muss ich aber meiner Funktion sagen, an welcher bzw. welchen Stellen das geschehen soll. Und da ist mein Knoten in der Rübe.

Wie übergebe ich der Funktion 1, 2 oder mehr Records aus 4 Integer?
Und - falls Set das beste wäre - wie prüft man das durch (beim Array ist mir das klar For I:= Low(Arr) To High(Arr) )?

Ich bin natürlich bereit, mich einzulesen, wenn mir jemand eine Fundstelle für einen Einstieg zur Suche liefern kann.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 10:03
Ich verstehe nicht wo hier auf einmal ein "Set" ins Spiel kommt. Ein Set ist eine Menge von mehreren Enumerationstypen von denen jedes Vorkommen ein- oder keinmal enthalten sein darf.

Beispiel:
Delphi-Quellcode:
type
   TGeschmack = (sauer, süß, bitter, salzig);
   TGeschmäcker = set of TGeschmack;
var
   chipsGeschmack:      TGeschmäcker;
   tofuGeschmack:      TGeschmäcker;
   zitronenGeschmack:   TGeschmäcker;
begin
   chipsGeschmack := [salzig];
   tofuGeschmack := [];
   zitronenGeschmack := [süß, bitter];
end;
Du sprichst selber von "1, 2 oder mehr Records". Das ist ganz klar ein Array (oder eine Liste oder ein anderer Mengentyp).

Delphi-Quellcode:
procedure bearbeiteKram(bildDaten: TPicture; außerDiesenBereichen: array of TRect);
begin
   //
end;

Oder ich habe wieder mal etwas völlig falsch verstanden...

Geändert von Der schöne Günther (26. Apr 2016 um 10:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 10:42
Übergebe die zusätzlichen Argumente in einer Klasse:
Delphi-Quellcode:
TProcessArgs = class
 ...
end;

procedure Process( aFoo: TFoo; aProcessArgs: TProcessArgs );
begin
  //
end;
Das macht mehr Sinn im Hinblick auf zukünftige Erweiterungen. Der Methodenaufruf bleibt immer gleich und trotzdem kannst du intern alles ändern.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 13:39
Danke erstmal für die Antworten und Ideen!

Ich verstehe nicht wo hier auf einmal ein "Set" ins Spiel kommt. Ein Set ist eine Menge von mehreren Enumerationstypen von denen jedes Vorkommen ein- oder keinmal enthalten sein darf.
genau.

Ich stelle mir das in etwa so vor (=Brainstorming, kein Code) und komme deshalb auf Set:
Delphi-Quellcode:
Const
   DRV : TRect = ( Left:0; Top:0; Right:20; Bottom:20);
   Knappschaft : TRect = ( Left:20; Top:20; Right:40; Bottom:40);
   // usw. die Positionen bleiben immer gleich
Type
   TBlankPos = (DRV, Knappschaft, ...);
   TBlank = Set Of TBlankPos;

Function IsEmpty(Image: TBitmap; BarCodes: TBlank): Boolean; // Kopf sehr verkürzt
Begin
   // mache etwas ...
End;

Procedure TForm1.Bildkommtan(Image: TBitmap);
Begin
   If IsEmpty(Image, [DRV]) Then ShowMessage('Leeres Bild')
   Else ShowMessage('Bild mit Inhalt');
End;
Ein Array wäre für mich denkbar (sonst stünde es nicht in der Überschrift), aber vermutlich eher die Notlösung. Denn ich müsste die Länge festlegen, es mit Daten bestücken etc. Ich fände das als Konstante besser lesbar. Mir geht es aber eben auch hauptsächlich darum, es von vorn herein erweiterbar zu gestalten.
Alex Winzer
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 15:38
Erweiterbar ist genau das was Rufo vorgeschlagen hat (wobei ich einen Record als typisches POD und keine Klasse genommen hätte)*. Packe die Daten die deine Methode zum Arbeiten braucht in eine Struktur und übergib sie ihr. Braucht die Methode eines Tages mehr Daten, passt du nur diese Klasse/Record an und nicht alle hundert Aufrufe im Programm.

Das mit dem Set habe ich jetzt war verstanden, finde es trotzdem nicht gut. Jedes mal wenn etwas neues hinzu kommt musst du deinen TBlankPos-Typ anfassen.
Packst du diese Absolutwerte für ein TRect wirklich direkt in den Quellcode? Ich finde, dadurch gewinnt man nicht viel. Wenn du es zur Laufzeit machst kann dein Benutzer das z.B. auch aus einer selbst anpassbaren Datei laden und muss dich nicht jedes mal nerven wenn er es ändern will.


* Irgendeine Berühmtheit hat mal gesagt zwei Methodenparameter gehen grade noch, drei seien zu viel (Ich glaube es war Martin Fowler).
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 15:42
* Irgendeine Berühmtheit hat mal gesagt zwei Methodenparameter gehen grade noch, drei seien zu viel (Ich glaube es war Martin Fowler).
Martin C. Fowler, "Clean Code", S. 73:
Zitat:
Funktionen, die drei Argumente übernehmen, sind erheblich schwerer zu verstehen als Dyaden. Die Probleme (...) werden mehr als verdoppelt.
Und auf Seite 74 werden die von Sir Rufo vorgeschlagenen "Argument Objekte" beschrieben. Sie sind keine Schummelei
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von TRomano
TRomano

Registriert seit: 24. Nov 2004
Ort: Düsseldorf
192 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Offenes Array oder Set als Parameter

  Alt 26. Apr 2016, 17:52
Ich bekomme immer wieder bei Refactoring das Grausen, wenn ich functions/procedures mit 15-20 Parametern sehe und diese in den Sourcen eines Projektes auch hunderte Male aufgerufen werden. Das ist eine Orgie, wenn mal ein Parameter geändert/zugefügt/gelöscht wird ...
Ich bevorzuge auch records als Parameter, wenn es mehr als drei Parameter werden sollen.
Thomas Forget
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
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