Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Mo 30.05.11 21:17 
Folgendes,

ich habe eine Liste von Artikeln, welche ich in eine Listbox ablegen möchte...
Das klappt soweit perfekt.

Nun Möchte ich den Artikeln aber auch noch eine Bestimmte Anzahl geben.
Das heißt, in der Liste solln jetzt nicht 6 mal untereinander Kugelschreiber stehen, sondern in der Liste Soll vor dem Eintrag eine 6 stehen.
Also so:

6 Kugelschreiber

Die soll aber im späteren Verlauf in eine Excelliste abgespeichert werden, daher hab ich mir gedacht das mit nem Record oder sowas zu machen, jedoch habe ich damit noch nie gearbeitet.

Soweit bin ich durch de.wikibooks.org/wik...phi:_Pascal:_Records ... gekommen ...


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TArtikel = Record
    Artikel, Anzahl : String;
  End;
TArtikelListe = array of TArtikel;


Jedoch hab ich keine Ahnung, wie ich das nun weiter machen soll.

Die Artikel füge ich so in die andere Liste ein:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm2.LB_ArtikelDblClick(Sender: TObject);
var
  ArtikelNr:integer;
begin
  if ArtikelAnz<= 13 then
  begin
    ArtikelAnz:=ArtikelAnz+1;
    ArtikelNr:=LB_Artikel.ItemIndex;
    ArtikelAuswahl:=LB_Artikel.Items.Strings[ArtikelNR];
    LB_Aus_Artikel.Items.Append(ArtikelAuswahl);
  end;
end;

oben wird durch Doppelklick in die Artikelliste, welche alle Artikel drin sind, welche in der Excel Tabelle enthalten sind.
Diese werden in die Liste eingefügt, welche max. 13 Artikel Enthalten dürfen, jedoch unbegrenzt an Anzahl.
Bedeutet.

13 Verschiedene Artikel mit (Anzahl ohne Ende)

wie kann ich das am besten Realisieren?

Kann mir hier jemand weiter bei helfen?

Danke :-)


[Edit:]
Ich Glaub habs in den falschen Forumsteil gepostet.
Sry
KleinesPferd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Di 31.05.11 06:20 
Guten Morgen,

soweit sich auf deiner Seite nach einer Mütze voll Schlaf kein Lichtlein angeschaltet hat, helfe ich mal etwas nach.

Ich glaube du möchtest nur eine simple [Anzahl] davor stehen haben, dazu wäre inttostr() hilfreich.
ausblenden Delphi-Quelltext
1:
ArtikelAuswahl:=inttostr(TArtikelListe[ArtikelNR].Anzahl)+' '+LB_Artikel.Items.Strings[ArtikelNR];					


Soll ja nur als Denkhilfe dienen. Für den ganz genauen Aufruf, wäre die entsprechende Variablen/Listendeklaration hilfreich.


Fröhlichen Vor-Kindertag.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 31.05.11 12:08 
Diese Simple Anzahl soll aber später aus dem Programm hinaus in Excel eingefügt werden, da ich via Makro in Excel die Datenverarbeitung starte, wo eine Rechnung erstellt wird.

Diese Rechnung wird wiederum in eine Datenbank gespeichert, das macht das Makro ebenfalls...
Aus diesem Grund weiß ich nicht, wie ich das am besten Realisieren kann.

Hab mir gedacht, dass ich das irgendwie über Array oder sowas zu machen.

Vorgehensweise:

Ich wähle ein Artikel per Doppelklick aus.
Dieser Artikel wird nun in einer neuen Liste hinzugefügt.
Standard mäßig soll die Anzahl auf "Eins" stehen.

Nun steht rechts in der Liste ein Artikel "Kugelschreiber".
Soll mit einem einfachen Rechtsklick in auf diesem Artikel ein Feld auf Tauchen, womit ich die Anzahl von diesem Artikel einstellen kann, hab mir gedacht, das über ein Edit Feld zumachen, welches nur Sichtbar wird, wenn man mit Rechtsklick auf den Artikel klickt.

Das hab ich auch soweit hinbekommen. Nun schreibe ich dort die Zahl "200" rein, weil 200 Kugelschreiber bestellt wurden.

Jetzt wird hinter dem Kugelschreiber die Zahl "Eins" getauscht mit der Zahl "200".

Nun fügt man weitere Artikel zu dieser Liste hinzu, jedoch Maximal 13 Artikel, mehr passen auf die Rechnung in Excel nicht drauf.

Im nach hinein fällt mir aber auf, das bei dem "dritten" Artikel eine Falsche Anzahl steht, also statt "Eins" soll da nun "15" rein...

Und das ist nun mein Problem, ich weiß nicht, wie ich das genau Realisieren kann, weil mir einfach die Kenntnisse dazu fehlen, wie ich sowas machen kann.

Ich hoffe man kann mir nun weiter helfen, falls der gesamte Source Code verlangt wird, kopiere ich diesen gerne hier hinein.


Gruß Christopher
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 31.05.11 14:19 
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Ich wähle ein Artikel per Doppelklick aus.
Dieser Artikel wird nun in einer neuen Liste hinzugefügt.
Standard mäßig soll die Anzahl auf "Eins" stehen.

Mit einem StringGrid mit z. B. zwei Spalten für Anzahl und Artikelbezeichnung hättest Du die Probleme nicht. Du fügst einen Artikel zum StringGrid hinzu und setzt dabei die Anzahl auf 1. Das StringGrid kann jederzeit editiert und somit die Anzahl geändert werden. Gleichzeitig kannst Du prüfen, ob schon 13 Artikel in der Liste vorhanden sind und eine entsprechende Meldung ausgeben. Und später setzt Du das Ganze mal als Datenbankanwendung um.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 31.05.11 15:39 
könntest du mir vielleicht ein kleines Beispiel dazu geben, wie ich das in meinem Fall anwenden kann?
Das wäre mir eine sehr große Hilfe, weil ich ehrlich gesagt Keine Ahnung davon habe, wie ich sowas anwenden kann.

Vorallem nicht, wie ich dann das in die ListBox übertragen kann...
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 31.05.11 16:48 
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Vorallem nicht, wie ich dann das in die ListBox übertragen kann...
Die Anzahl und die Artikelbeschreibung stehen lesbar im StringGrid. Da braucht man keine ListBox.
Beispiel, bei dem ich einfach die Artikelbeschreibung aus einem Editfeld hole:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Bis auf Cells kann man das auch im Objektinspektor einstellen.

  // 1 Beschriftungszeile + 13 Artikelzeilen
  // 2 Spalten für Anzahl + Artikelbeschreibung
  StringGrid1.ColCount := 2;
  StringGrid1.RowCount := 14;

  // 1 nicht editierbare Beschriftungszeile
  StringGrid1.FixedRows := 1;

  // Sonst kann man nichts Editieren.
  StringGrid1.Options := StringGrid1.Options + [goEditing];

  // Beschriftung des StringGrids
  StringGrid1.Cells[00] := 'Anzahl';
  StringGrid1.Cells[10] := 'Artikelbeschreibung';

  // Damit ich beim Programmlauf nicht soviel tippen muss.
  Edit1.Text := 'Kugelschreiber, blau';
end;

function TForm1.FindeFreieZeile: integer;
var
  Schleife : integer;
begin
  // Als freie Zeile wird hier gewertet, wenn in der Spalte Anzahl
  // nichts drin steht. Zusätzlich könnte man hier überprüfen,
  // ob eine Null in der Spalte mit der Anzahl steht oder ob
  // die Zelle mit der Artikelbeschreibung leer ist.
  // Wird keine freie Zeile gefunden, wird - 1 zurück gegeben.
  // ---> = 13 Artikelzeilen voll
  Result := - 1;
  for Schleife := StringGrid1.RowCount - 1 downto 0 do
    if Trim(StringGrid1.Cells[0, Schleife]) = '' then
      Result := Schleife;
end;

procedure TForm1.BtnAddClick(Sender: TObject);
var
  Zeile : integer;
begin
  Zeile := FindeFreieZeile;
  if Zeile = - 1 then    // keine freie Zeile gefunden
    ShowMessage('Zu viele Artikel!')
  else
    begin
      StringGrid1.Cells[0, Zeile] := '1';
      StringGrid1.Cells[1, Zeile] := Edit1.Text;
    end;
end;
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 31.05.11 17:07 
Ich habe hier mal den Source Code, vielleicht kannst du hier mit einen besseren Überblick schaffen.
Und hier ein Link zu einem Bild des Programms: www.delphi-forum.de/download.php?id=13975

Sollte relativ klar sein, was was ist.

Aber deine Antwort war sehr hilfreich, nur bin ich sehr unsicher, was die Umsetzung in mein Programm angeht.

Moment mal, was mir gerade bei genauem Betrachten auffällt, kann ich nicht einfach neben der Liste der Ausgewählten Artikel, eine Weitere Liste Setzten und diese so nah dran, als wenn diese eine Liste wäre, um dann dort mit jedem Doppel Klick auf einen Artikel, in der Anzahl für Artikel und für die Ausgeählten Artikel, einen Eintrag hinzufügen?

Wäre doch Theoretisch machbar, oder?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    LB_Kunde: TListBox;
    Label1: TLabel;
    LB_Artikel: TListBox;
    Label2: TLabel;
    Button2: TButton;
    E_Kunde: TEdit;
    L_Kunde: TLabel;
    LB_Aus_Artikel: TListBox;
    Label3: TLabel;
    Button3: TButton;
    CheckBox1: TCheckBox;
    E_Lieferdatum: TEdit;
    L_DatumLayout: TLabel;
    B_Vorschau: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure LB_KundeClick(Sender: TObject);
    procedure LB_ArtikelDblClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure B_VorschauClick(Sender: TObject);
    procedure LB_Aus_ArtikelContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
    procedure LB_Aus_ArtikelDblClick(Sender: TObject);

  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
    var
      Excel:variant;
      Kundenauswahl,Artikelauswahl:string;
      ArtikelAnz:integer;
    procedure ArtikelFuellen;
    procedure Memofüllen;
  end;

type
  TArtikel = Record
    Artikel, Anzahl : String;
  End;
TArtikelListe = array of TArtikel;

var
  Form2: TForm2;

implementation

uses Unit3;

{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
  ArtikelFuellen;
end;
//------------------------------------------------------------------------------
procedure TForm2.Button2Click(Sender: TObject);
begin
  close;
end;
//------------------------------------------------------------------------------
procedure TForm2.B_VorschauClick(Sender: TObject);
begin
  form3.show;
  MemoFüllen;
end;
//------------------------------------------------------------------------------
procedure TForm2.CheckBox1Click(Sender: TObject);
begin
  E_Lieferdatum.Visible:=True;
  L_DatumLayout.Visible:=True;
end;
//------------------------------------------------------------------------------
procedure TForm2.FormShow(Sender: TObject);
begin
  ArtikelAnz:=1;
end;

//------------------------------------------------------------------------------
procedure TForm2.LB_ArtikelDblClick(Sender: TObject);
var
  ArtikelNr:integer;
begin
  if ArtikelAnz<= 13 then
  begin
    ArtikelAnz:=ArtikelAnz+1;
    ArtikelNr:=LB_Artikel.ItemIndex;
    ArtikelAuswahl:=LB_Artikel.Items.Strings[ArtikelNR];
    LB_Aus_Artikel.Items.Append(ArtikelAuswahl);
  end;
end;
//------------------------------------------------------------------------------
procedure TForm2.LB_Aus_ArtikelContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
  //Hier kommte die Anzahl je Artikel per Rechtsklick rein
  showmessage('hallo');
end;
//------------------------------------------------------------------------------
procedure TForm2.LB_Aus_ArtikelDblClick(Sender: TObject);
var
i: Integer;
begin
  with LB_Aus_Artikel do
  begin
    i := 0;
    while (i <= Items.Count - 1and (SelCount > 0do
      begin
        while (i <= Items.Count - 1and Selected[i] do
          Items.Delete(i);
          inc(i);
      end;
  end;
end;

//------------------------------------------------------------------------------
procedure TForm2.LB_KundeClick(Sender: TObject);
var
  KundenNr:integer;

begin
  KundenNr:=LB_Kunde.ItemIndex;
  Kundenauswahl:=LB_Kunde.Items.Strings[KundenNr];
  E_Kunde.Text:=Kundenauswahl;
end;
//------------------------------------------------------------------------------
procedure TForm2.ArtikelFuellen;
var
  Excel, ArtikelSheet, ContactsSheet: OleVariant;
  i,iMaxZeilen: Integer;
begin
  try
    try
      Excel := CreateOleObject('Excel.Application');
    except
      Excel := GetActiveOleObject('Excel.Application');
    end;
    Excel.Workbooks.Open(ExtractFilePath(Paramstr(0))+('rechi.xls'));

    ContactsSheet := Excel.Workbooks['rechi.xls'].Worksheets['Kontakte'];
    iMaxZeilen := ContactsSheet.UsedRange.Rows.Count;
    for i := 1 to iMaxZeilen do
      LB_Kunde.Items.Append(ContactsSheet.Cells[i, 1]);

    ArtikelSheet := Excel.Workbooks['rechi.xls'].Worksheets['Artikel'];
    iMaxZeilen := ArtikelSheet.UsedRange.Rows.Count;
    for i := 1 to iMaxZeilen do
      LB_Artikel.Items.Append(ArtikelSheet.Cells[i, 1]);

    Excel.ActiveWorkBook.Saved := TRUE;
    Excel.Quit; // Beendet Excel
    Excel := Unassigned;
  except
    Showmessage('Fehler, Exceldaten konnten nicht eingelesen werden');
    Exit;
  end;
end;
//------------------------------------------------------------------------------
procedure TForm2.Memofüllen;
var
  i:integer;

  begin
  Unit3.Form3.M_Rechnung.Lines.Add(Kundenauswahl);
  for i := 0 to ArtikelAnz - 1 do
    begin
      Unit3.Form3.M_Rechnung.Lines.Add('');
    end;

end;
//------------------------------------------------------------------------------
end.
KleinesPferd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Di 31.05.11 17:17 
Hallöchen,

StringGrids sind da wirklich eine schönere Lösung. Besonders da du die Zellen ähnlich den Excel Zellen ansprechen kannst.

Deine Zweite Liste... nunja, was passiert wenn du in der einen Runterscrolls mit der Anderen?

Bei der von mir angesprochenen Möglichkeit kannst du auch beim Auslesen einfach die Zeile nach dem ersten Leerzeichen absuchen und wenn der Inhalt davor länger 0 ist, könntest du dies in eine Zahl Wandeln und an Excel übergeben.

Nimm aber lieber das Grid. Viel weniger Aufwand.

Grüße
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 31.05.11 17:33 
Für Kunde und Artikel würde ich eher je eine ComboBox verwenden. Und die ausgewählten Artikel stehen alle im StringGrid.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Mi 01.06.11 11:17 
Ich danke euch für eure mühe, habe jedoch jetzt nochmal selber versucht mich mit Record auseinander zu setzten.

habe nun folgenden Lösungsweg genommen und würde gerne wissen, ob ihr das evtl. auch so machen würdet.
Dazu ist zu sagen, das ich die Stückzahl in einer weiteren Liste reingepackt habe.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm2.LB_ArtikelDblClick(Sender: TObject);
var
  ArtikelNr:integer;

begin
  if ArtikelAnz<= 13 then
  begin
    ArtikelAnz:=ArtikelAnz+1;
    ArtikelNr:=LB_Artikel.ItemIndex;
    //Record wird aufgezeichnet
    ArtikelAuswahl[ArtikelNr].Ind:=LB_Artikel.Items.Strings[ArtikelNR]; //Der Index eines Artikels wird festgelegt
    ArtikelAuswahl[ArtikelNr].Anzahl:=IntToStr(ArtikelAnzahl);          //Die Anzahl der Artikelstückzahl wird festgelegt
    ArtikelAuswahl[ArtikelNr].Name:=LB_Artikel.Items.Strings[ArtikelNR];//Der Name des Artikels wird festgelegt
    //Record fertig
    //Artikel werden in Liste geschrieben
    LB_Aus_Artikel.Items.Append(ArtikelAuswahl[ArtikelNr].Name);
    LB_aus_ArtikelAnz.Items.Append(ArtikelAuswahl[ArtikelNr].Anzahl);
  end;
end;


Edit: Musste leider feststellen, das bei der Zeile 13, eine Exception auftritt und zwar:
Im Projekt RechnungErstellen.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00406924 in Modul 'RechnungErstellen.exe'. Lesen von Adresse FFFFFFF7' aufgetreten.

Dies Passiert aber nur, wenn ich den Ersten Artikel aus der Artikel Liste in die Liste für ausgewählte Artikel einfüge. Klick ich den Zweiten Artikel an, passiert dies nicht, gestern war der Fehler noch beim 13 Artikel.

[Edit2:] Fehler gelöst...das Problem war, das ich bei ArtikelAuswahl[ArtikelNr] die Falsche Variable genommen habe...Stattdessen muss das so stehen: ArtikelAuswahl[ArtikelAnz]