AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur zusammenbauen

Ein Thema von josefkoller · begonnen am 17. Nov 2012 · letzter Beitrag vom 18. Nov 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#11

AW: Prozedur zusammenbauen

  Alt 17. Nov 2012, 21:59
Nachdem ich jetzt den Ausgangspost noch 4 Mal intensiv durchgelesen habe könntest Du Recht haben. Ich hatte mich auch schon gewundert wegen des Array of const.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#12

AW: Prozedur zusammenbauen

  Alt 17. Nov 2012, 22:10
Hi,

Mehrdimensionale Arrays kann man AFAIK nicht als offene Arrays übergeben, aber wenn man typisiert, sollte das klappen. Schnell unter Lazarus zusammengetippt und ausprobiert:
Delphi-Quellcode:
type
  TStringArray = array of string;

procedure ShowValues(const ValueArrays: array of TStringArray);
var
  i, j: integer;
begin
  for i := Low(ValueArrays) to High(ValueArrays) do
    for j := Low(ValueArrays[i]) to High(ValueArrays[i]) do
      ShowMessage(ValueArrays[i, j]);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  Arr1, Arr2: TStringArray;
begin
  SetLength(Arr1, 2);
  Arr1[0] := 'Hallo';
  Arr1[1] := 'Welt';
  SetLength(Arr2, 3);
  Arr2[0] := 'Hier';
  Arr2[1] := 'bin';
  Arr2[2] := 'ich';
  ShowValues([Arr1, Arr2]);
  Arr1 := nil;
  Arr2 := nil;
end;
Kann aber auch sein, dass ich das Problem nicht richtig verstanden habe.

eben bei

ShowValues([Arr1, Arr2]);

wie in Deinem Beispiel hakt es. wie bekomme ich da eins, zwei drei, vier Arrays rein? also nicht händisch reingetippt.

danke.

Josef
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#13

AW: Prozedur zusammenbauen

  Alt 17. Nov 2012, 22:17
Nun bin ich aber doch wieder verwirrt. Kannst Du mir mal einen angedachten Aufruf anhand meines Beispiels zeigen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#14

AW: Prozedur zusammenbauen

  Alt 17. Nov 2012, 22:21
Delphi-Quellcode:
DrawTextAcrossCols([arrColText[0,b]]); Wenn es zwei sind, dann halt so:

DrawTextAcrossCols([arrColText[0,b], [arrColText[1,b] ]); usw.
daraus schließe ich, dass es sich klarerweise um ein zwei dimensionales Array handelt.
Du willst von diesem Array jeweils die ersten Werte übergeben.. Sprich [0,0], [1, 0], [2,0]..
-Edit- Nicht die ersten, sondern die "b" ten Elemente -/Edit-
Im angehänten Bild ist dies genau der rot markierte Bereich!
-Edit- B ist in diesem Fall 0 -/Edit-
GENAU das ist auch ein Array..
dazu musste es erst bilden:

Delphi-Quellcode:
var
  roterBereich: Array of String;
begin
  SetLength(roterBereich, Length(arrColText));
  for i := 0 to high(roterBereich) do
    roterBereich[i] := arrColText[i,b];
und anschließend rufst du die Methode ganz einfach auf..
Delphi-Quellcode:
//so
DrawTextAcrossCols(roterBereich);
Und noch etwas - lies dir bitte ein paar Tutorials zu Arrays durch.
Miniaturansicht angehängter Grafiken
untitled.png  
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (17. Nov 2012 um 22:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#15

AW: Prozedur zusammenbauen

  Alt 17. Nov 2012, 22:23
Zeig doch mal die Deklaration von DrawTextAcrossCols.

wie in Deinem Beispiel hakt es. wie bekomme ich da eins, zwei drei, vier Arrays rein? also nicht händisch reingetippt.
Du legst dr auch noch eine Variable (array of TStringArray ) an, befüllst sie und übergibst dann diese an die Funktion.


Die Art der möglich Zuweisungen lassen auf eine Array of Const schließen,
Zitat:
so einfach kann da kein Array zugewiesen werden.
PS: ein array of const ist intern ein array of TVarRec und sowas kann man einer Funktion auch übergeben.
(nur die Speicherverwaltung ist etwas nervig, darum ist es schönder, wenn man diese Array-Verwaltung in einer Klasse kapselt, welche sich sicher um alles kümmert)

Man kann halt nur Arrays des gleichen Typs zuweisen.
Man kann z.B. auch kein Array of AnsiString einem Array of WideString oder einemAray of Variant zuweisen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Nov 2012 um 22:28 Uhr)
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#16

AW: Prozedur zusammenbauen

  Alt 17. Nov 2012, 22:42
Hi,

danke für die antworten. Nur, es ist nichts passendes dabei.

Das mit dem Polygon muß ich mir nochmal überlegen.

Ich hab mittlerweile im Netz auch weitergesucht.

Zwei Möglichkeiten hab ich da gefunden:

1. Das ganze mit case zu machen. Also

Delphi-Quellcode:
case counts of
  1:
    begin
     for b:=0 to lns-1 do
      DrawTextAcrossCols([arrColText[0,b]]); <-- ein Array
    end;
  2:
    begin
     for b:=0 to lns-1 do
       DrawTextAcrossCols([arrColText[0,b], [arrColText[1,b]]); <-----
     end;
usw. Mann müßte aber einfach irgendwann aufhören.

Ist also auch nicht dynamisch erstellbar.

Oder kann man per Code so ein variables case Construkt erstellen?

2. Möglichkeit

Delphi-Quellcode:
unit formTest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TProcedure = procedure;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Foo;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var p: TProcedure;
begin
  p := self.MethodAddress('Foo');
  if Assigned(p) then
    p;
end;

procedure TForm1.Foo;
begin
  MessageDlg('Hallo!',mtInformation,mbOKCancel,0);
end;

end.
Das klappt aber bei mir nicht.

p wird nicht assigned, ist leer:


Ich hab das bei mir so probiert:

Delphi-Quellcode:
type
  TProcedure = procedure;
..
public
procedure DrawTextAcrossCols(const arrColumnText: Array of string; Background:TColor = clNone);
procedure DrawTextAcrossColsEx(const arrColumnText: Array of string);
procedure prepare(const arrColumnText: Array of string);
.....

procedure TTest.DrawTextAcrossColsEx(const arrColumnText: Array of string);
var prepare:string;
P:TProcedure
begin
..
    prepare:='([';
    for a:=0 to high(arrColumnText) do
      prepare:=prepare+'arrColText[0,b],';
    prepare:=copy(prepare,0,length(prepare)-1);
    prepare:=prepare+'])';
 

    p := self.MethodAddress('prepare');
      if Assigned(p) then p;
..
end;

procedure TTest.peparedDrawGrid(const arrColumnText: Array of string);
begin
//leer;
end;
Diese zweite Möglichkeit scheint mir die Geeignete zu sein. Nur: es funktioniert so nicht. P ist immer leer.


Vielleicht seht ihr jetzt besser, was ich erreichen will. Den Tipp, daß ich mir Array Tutorials anschauen soll, finde ich sehr sinnvoll, nur hat das nichts mit dem Aufruf einer Prozedur zu tun, die "zusammengebastelt" werden soll.

Könnt ihr mir vielleicht bei diesem Aufruf in der 2. Möglichkeit auf die Sprünge helfen?

Danke für den Link:

Thema: http://rvelthuis.de/articles/articles-openarr.html

Muß mal schauen, was da drin steht.

Josef

P.S.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#17

AW: Prozedur zusammenbauen

  Alt 18. Nov 2012, 00:27
Ich wusste nicht dass DrawTextAcrossCols von Dir definiert werden kann, ich bin davon ausgegangen sie sei vorgegeben.
Wenn Du sie selbst festlegen kannst tust Du Dir sicher leichter, bei Deiner Anforderung an den Aufruf, wenn Du kein Open Array verwendest sondern etwas in der Art:



Delphi-Quellcode:

Type
TMyCellRecord=Record
  Text:String;
  Color:TColor;
end;

TMyDrawArray=Array of Array of TMyCellRecord;


Procedure DrawMyArray(a:TMyDrawArray);
var
 c,r:Integer;
begin
  for r := 0 to High(a) do
     for c := 0 to High(a[r]) do
        // Irgendwas mit der Zelle
end;

procedure TForm5.Button1Click(Sender: TObject);
const
 cols=2;
 rows=5;
var
 a:TMyDrawArray;

begin
  SetLength(a,rows,cols);
  a[0][0].Text := 'eins';
  a[0][0].Color := clLime;
//......
  DrawMyArray(a)
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#18

AW: Prozedur zusammenbauen

  Alt 18. Nov 2012, 01:38
Hi,

Danke, daß Du mir noch ungefähr folgen kannst und Dich bemühst.

Vielleicht sollte ich doch etwas ausholen:

Es gibt in einer Komponente die Prozedur

procedure DrawTextAcrossCols(const arrColumnText: Array of string; Background:TColor = clNone); Damit kann man eine Art PDF-Datei mit Vorschau erstellen.

Der Nachteil dieser Procedure: Man kann nur eine Zeile in einem Spaltentext schreiben. Ist der Text, der in die Spalte soll länger oder umgebrochen, wird er abgeschnitten.

Aufgerufen wird diese Prozedure eben mit einem StringArray,also so:

DrawTextAcrossCols([memo1.text,memo2.txt,memo3.text]);

Jetzt ist es wahrscheinlich, daß eben in den Memos eine verschiedene Anzahl von Zeilen drin ist. Also muß eine Prozedur her, die nicht nur eine Zeile schreibt, sondern alle.

Diese Prozedur heißt bei mir eben in Anlehnung an das Original

procedure DrawTextAcrossColsEx(const arrColumnText: Array of string; Background:TColor = clNone); Aufgerufen wird sie genauso, wie die Originalprozedur.

Ich übernehme dann die übergebenen memo-Texte in eine Stringliste und übergebe dann die String-Zeilen wieder an ein String Array. Anschließend wird die Arraylänge bei dem neuen Array auf die gleiche maximale Länge gesetzt.

Delphi-Quellcode:
var
 fMemo:TStringList;
 arrColText: Array of Array of string;
 ..
begin
  try
    fMemo:=TStringList.Create;

    for a:=0 to high(arrColumnText) do begin <--- Übergabe Array
      fMemo.text:=arrColumnText[a]; <--- Stringliste
      SetLength(arrColText[a], fMemo.Count); neues Array Länge zuweisen
      lns:=fMemo.Count;
      if fMemo.Count > lns then
        lns:=fMemo.Count; <---- Länge zählen und jeweils auf neuen Wert
                                           wenn neuer Wert größer als alter
      for b:=0 to fMemo.Count -1 do begin
        arrColText[a][b]:=fMemo.Strings[b]; <---- neues Array zeilenweise füllen
      end;
    end;

    for a:=0 to high(arrColText) do
      setlength(arrColText[a],lns); <--- alles auf die gleiche Höhe
Raus kommt dann ein Array mit der gleichen Länge bei allen Ebenen.
Die gleiche Länge deswegen, damit es beim Durchlaufen zum Ausgeben zu keinen Exceptions kommt.

Sieht dann etwa so aus:
__________________________________________________ _________
|0 |1 |2 |
-----------------------------------------------------------
|Text |Text Text |Text Text Text |
| | |Test Test Test |
usw.

Jetzt hab ich Zeilen, die ich mit der ursprünglichen Prozedur zeilenweise ausgeben kann, indem ich das neue Arrays mit einer for Schleife durchlaufe.

Also so:

Delphi-Quellcode:

   for b:=0 to lns-1 do
     DrawTextAcrossCols([arrColText[0,b], arrColText[1,b], arrColText[2,b]]);
Das "lns" wäre das high von arrColText. Ist, wie gesagt, bei allen auf die gleiche maximale "Höhe" angeglichen worden. In meinem Test würden 16 Zeilen erstellt.

In den ersten Spalten der Ausgabe würde dann in der ersten Reihe in allen drei Spalten was drin stehen, dann nur noch 15 mal was in der dritten Spalte.

Soweit funktioniert das wie gewollt.

Jetzt fehlt halt noch der dynamische Aufbau der Prozedur.

Je nachdem, wieviele Einträge das übergebende Array hat, muß eben eine verschiedene Anzahl von Parametern in die Prozedur.

Einmal so:

Delphi-Quellcode:
   for b:=0 to lns-1 do
     DrawTextAcrossCols([arrColText[0,b], arrColText[1,b], arrColText[2,b]]);
oder halt so:

Delphi-Quellcode:
   for b:=0 to lns-1 do
     DrawTextAcrossCols([arrColText[0,b]]);

usw.

Vielleicht gibts ja doch was .

Danke für die Geduld.

Josef
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 18:20 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