Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array mit Variablen? (https://www.delphipraxis.net/143771-array-mit-variablen.html)

Borschti 23. Nov 2009 10:29


Array mit Variablen?
 
Hallo,

ich habe ein kleines Problem welches sicherlich schon einige hier hatten ;)
Also in meinem Programm geht es darum, Kundendaten die in eine Exceltabelle geschrieben wurden, einzulesen und in Outlook als Kontakte zu speichern, dies funktioniert eigentlich auch schon Wunderbar. Der Knackpunkt ist jetzt aber das die Kundenkontakte in der Exceltabelle mehrere Ansprechpartner in den jeweiligen Firmen haben können aber nicht klar definiert ist wieviele es maximal sein können. Z.Z. ist es so das ich mit maximal 5 Ansprechpartnern pro Kundenkontakt rechne und es auch so programmiert habe das fünf Ansprechpartner für einen Kontakt in Outlook gespeichert werden. Aber wie das so ist gibt es irgendwann einen Kunden der sechs Ansprechpartner hat, deswegen möchte ich das gerne dynamisch machen aber ich weiß nicht genau wie.

Hier ist erstmal meine procedure wie ich sie z.Z. habe, sprich mit dem festen Wert von fünf Ansprechpartnern pro Kundenkontakt:
Delphi-Quellcode:
procedure TKontakt.FillProbs(WorkSheet: _WorkSheet; activeRow : Integer;
                             APCount, FillCount, lastActiveRow : Integer;
                             isHeader : Boolean);
var
  isZero : Boolean;
  isEmptyStr : String;
begin

  if isHeader and (FillCount <= 1) then
    begin
      inc(activeRow);
      activeRow := activeRow + APCount;
    end else
      begin
        activeRow := lastActiveRow + APCount;
      end;

  FLastActiveRow := activeRow;

  KndNr := Worksheet.Cells.Item[activeRow, 1].Value;
  CompanyName := Worksheet.Cells.Item[activeRow, 2].Value;
  FullName := Worksheet.Cells.Item[activeRow, 3].Value;
  BusinessAdressStreet := Worksheet.Cells.Item[activeRow, 4].Value;
  BusinessAddressPostalCode := Worksheet.Cells.Item[activeRow, 5].Value;
  BusinessAddressCity := Worksheet.Cells.Item[activeRow, 6].Value;
  BusinessTelephoneNumber := Worksheet.Cells.Item[activeRow, 7].Value;
  BusinessFaxNumber := Worksheet.Cells.Item[activeRow, 8].Value;
  EmailAddress := Worksheet.Cells.Item[activeRow, 9].Value;
  BusinessHomePage := Worksheet.Cells.Item[activeRow, 10].Value;
  FileAs := Worksheet.Cells.Item[activeRow, 11].Value;
  bsLfdNr0 := Worksheet.Cells.Item[activeRow, 12].Value;
  bsAP0 := Worksheet.Cells.Item[activeRow, 13].Value;
  bsFunktion0 := Worksheet.Cells.Item[activeRow, 14].Value;
  bsTelNr0 := Worksheet.Cells.Item[activeRow, 15].Value;
  bsFaxNr0 := Worksheet.Cells.Item[activeRow, 16].Value;
  bsEMail0 := Worksheet.Cells.Item[activeRow, 17].Value;

  bsAPCount := 1;
  isZero := false;

  isEmptyStr := Worksheet.Cells.Item[activeRow + 1, 12].Value;

  if (Worksheet.Cells.Item[activeRow + 1, 12].Value <> '0') and (isZero = false) then
    begin
      if isEmptyStr <> '' then
        begin
          bsLfdNr1 := Worksheet.Cells.Item[activeRow + 1, 12].Value;
          bsAP1 := Worksheet.Cells.Item[activeRow + 1, 13].Value;
          bsFunktion1 := Worksheet.Cells.Item[activeRow + 1, 14].Value;
          bsTelNr1 := Worksheet.Cells.Item[activeRow + 1, 15].Value;
          bsFaxNr1 := Worksheet.Cells.Item[activeRow + 1, 16].Value;
          bsEMail1 := Worksheet.Cells.Item[activeRow + 1, 17].Value;

          bsAPCount := 2;
          isZero := true;
        end;
    end;

  isEmptyStr := Worksheet.Cells.Item[activeRow + 2, 12].Value;
  if (Worksheet.Cells.Item[activeRow + 2, 12].Value <> '0') and (isZero = true) then
    begin
      if isEmptyStr <> '' then
        begin
          bsLfdNr2 := Worksheet.Cells.Item[activeRow + 2, 12].Value;
          bsAP2 := Worksheet.Cells.Item[activeRow + 2, 13].Value;
          bsFunktion2 := Worksheet.Cells.Item[activeRow + 2, 14].Value;
          bsTelNr2 := Worksheet.Cells.Item[activeRow + 2, 15].Value;
          bsFaxNr2 := Worksheet.Cells.Item[activeRow + 2, 16].Value;
          bsEMail2 := Worksheet.Cells.Item[activeRow + 2, 17].Value;

          bsAPCount := 3;
          isZero := true;
        end else
          begin
            isZero := false;
          end;
    end else
      begin
        isZero := false;
      end;

  isEmptyStr := Worksheet.Cells.Item[activeRow + 3, 12].Value;
  if (Worksheet.Cells.Item[activeRow + 3, 12].Value <> '0') and (isZero = true) then
    begin
      if isEmptyStr <> '' then
        begin
          bsLfdNr3 := Worksheet.Cells.Item[activeRow + 3, 12].Value;
          bsAP3 := Worksheet.Cells.Item[activeRow + 3, 13].Value;
          bsFunktion3 := Worksheet.Cells.Item[activeRow + 3, 14].Value;
          bsTelNr3 := Worksheet.Cells.Item[activeRow + 3, 15].Value;
          bsFaxNr3 := Worksheet.Cells.Item[activeRow + 3, 16].Value;
          bsEMail3 := Worksheet.Cells.Item[activeRow + 3, 17].Value;

          bsAPCount := 4;
          isZero := true;
        end else
          begin
            isZero := false;
          end;
    end else
      begin
        isZero := false;
      end;

  isEmptyStr := Worksheet.Cells.Item[activeRow + 4, 12].Value;
  if (Worksheet.Cells.Item[activeRow + 4, 12].Value <> '0') and (isZero = true) then
    begin
      if isEmptyStr <> '' then
        begin
          bsLfdNr4 := Worksheet.Cells.Item[activeRow + 4, 12].Value;
          bsAP4 := Worksheet.Cells.Item[activeRow + 4, 13].Value;
          bsFunktion4 := Worksheet.Cells.Item[activeRow + 4, 14].Value;
          bsTelNr4 := Worksheet.Cells.Item[activeRow + 4, 15].Value;
          bsFaxNr4 := Worksheet.Cells.Item[activeRow + 4, 16].Value;
          bsEMail4 := Worksheet.Cells.Item[activeRow + 4, 17].Value;

          bsAPCount := 5;
        end;
    end;
 
end;
Ich habe schon probiert die ganzen Blöcke in eine Schleife zu packen, in etwa so(einfach mal so runter geschrieben, sind bestimmt ein paar Fehler drin):
Delphi-Quellcode:
procedure TKontakt.FillProbs(WorkSheet: _WorkSheet; activeRow : Integer;
                             APCount, FillCount, lastActiveRow : Integer;
                             isHeader : Boolean);
var
  isZero : Boolean;
  isEmptyStr : String;
begin

  if isHeader and (FillCount <= 1) then
    begin
      inc(activeRow);
      activeRow := activeRow + APCount;
    end else
      begin
        activeRow := lastActiveRow + APCount;
      end;

  FLastActiveRow := activeRow;

  KndNr := Worksheet.Cells.Item[activeRow, 1].Value;
  CompanyName := Worksheet.Cells.Item[activeRow, 2].Value;
  FullName := Worksheet.Cells.Item[activeRow, 3].Value;
  BusinessAdressStreet := Worksheet.Cells.Item[activeRow, 4].Value;
  BusinessAddressPostalCode := Worksheet.Cells.Item[activeRow, 5].Value;
  BusinessAddressCity := Worksheet.Cells.Item[activeRow, 6].Value;
  BusinessTelephoneNumber := Worksheet.Cells.Item[activeRow, 7].Value;
  BusinessFaxNumber := Worksheet.Cells.Item[activeRow, 8].Value;
  EmailAddress := Worksheet.Cells.Item[activeRow, 9].Value;
  BusinessHomePage := Worksheet.Cells.Item[activeRow, 10].Value;
  FileAs := Worksheet.Cells.Item[activeRow, 11].Value;
  bsLfdNr0 := Worksheet.Cells.Item[activeRow, 12].Value;
  bsAP0 := Worksheet.Cells.Item[activeRow, 13].Value;
  bsFunktion0 := Worksheet.Cells.Item[activeRow, 14].Value;
  bsTelNr0 := Worksheet.Cells.Item[activeRow, 15].Value;
  bsFaxNr0 := Worksheet.Cells.Item[activeRow, 16].Value;
  bsEMail0 := Worksheet.Cells.Item[activeRow, 17].Value;

  bsAPCount := 1;
  isZero := false;

  isEmptyStr := Worksheet.Cells.Item[activeRow + 1, 12].Value;

  for i := 0 to X
    begin
      if (Worksheet.Cells.Item[activeRow + i, 12].Value <> '0') and (isZero = false) then
        begin
          if isEmptyStr <> '' then
            begin
              bsLfdNr1 := Worksheet.Cells.Item[activeRow + i, 12].Value;
              bsAP1 := Worksheet.Cells.Item[activeRow + i, 13].Value;
              bsFunktion1 := Worksheet.Cells.Item[activeRow + i, 14].Value;
              bsTelNr1 := Worksheet.Cells.Item[activeRow + i, 15].Value;
              bsFaxNr1 := Worksheet.Cells.Item[activeRow + i, 16].Value;
              bsEMail1 := Worksheet.Cells.Item[activeRow + i, 17].Value;

              bsAPCount := i + 1;
              isZero := true;
            end;
        end;
    end;
end;
Hier stoße ich jetzt natürlich auf das Problem, dass ich nicht für jeden Schleifendurchlauf die Variablen(also für den zweiten Schleifendurchlauf müsste ich die Variablen bsLfdNr2, bsAP2, bsFunktion2 usw. nehmen) die Variablen nehmen kann ich brauch :D Ich denke mir das so das ich die Variablen mit Hilfe der Schleifenvariable ansprechen will aber das funktioniert natürlich nicht :(

Habe dann später irgendwie an ein Array mit Variablen gedacht, geht das? :D Oder wie löst ihr das Problem? hatte das Problem früher schon oft aber bin immer irgendwie drum herum gekommen nur jetzt weiß ich nicht wie ich das verwirklichen kann?

Danke für alle hilfreichen Antworten, ich steh echt vor einer Mauer :(

VG
Alex

Luckie 23. Nov 2009 10:41

Re: Array mit Variablen?
 
Guck dir mal dynamische Arrays und Delphi-Referenz durchsuchenSetLength an.

shmia 23. Nov 2009 16:24

Re: Array mit Variablen?
 
Der erste Schritt wäre das Zusammenfassen der Informationen zu einer Struktur:
Delphi-Quellcode:
TPersonContact = record
  Funktion : string; // z.B. Leiter der EDV
  Tel: string;
  Fax: string;
  EMail : string;
end;
Diesen Record kann man in einem Array of TPersonContact oder einer Liste (Ableitung von TList) speichern.
Wenn du schlau bist, dann bleibst du nicht bei einem Record stehen, sondern machst gleich eine Klasse daraus.
Delphi-Quellcode:
TPersonContact = class(TObject)
public
  procedure ReadFromWorksheet(sheet:Worksheet; row, col:integer);
  property Funktion : string; // z.B. Leiter der EDV
  property Tel: string;
  property Fax: string;
  property EMail : string;
end;
Dann kannst du nämlich auch Methoden hinzufügen.
Die Methode ReadFromWorksheet würde die Daten aus dem übergebenen Worksheet lesen; beginnend ab der Zelle,
die mit row und col angesprochen wird.
Die Objekte der Klasse TPersonContact würde man dann in einer TObjectList speichern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 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