| Autor |
Beitrag |
Xearox
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: 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 ...
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:
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
      
Beiträge: 29
|
Verfasst: 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.
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 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 31.05.11 14:19
Xearox hat folgendes geschrieben : | 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 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Di 31.05.11 16:48
Xearox hat folgendes geschrieben : | | 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:
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 StringGrid1.ColCount := 2; StringGrid1.RowCount := 14;
StringGrid1.FixedRows := 1;
StringGrid1.Options := StringGrid1.Options + [goEditing];
StringGrid1.Cells[0, 0] := 'Anzahl'; StringGrid1.Cells[1, 0] := 'Artikelbeschreibung';
Edit1.Text := 'Kugelschreiber, blau'; end;
function TForm1.FindeFreieZeile: integer; var Schleife : integer; begin 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 ShowMessage('Zu viele Artikel!') else begin StringGrid1.Cells[0, Zeile] := '1'; StringGrid1.Cells[1, Zeile] := Edit1.Text; end; end; |
|
|
Xearox 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: 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?
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
public 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 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 - 1) and (SelCount > 0) do begin while (i <= Items.Count - 1) and 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; 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
      
Beiträge: 29
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: 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 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: 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.
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; ArtikelAuswahl[ArtikelNr].Ind:=LB_Artikel.Items.Strings[ArtikelNR]; ArtikelAuswahl[ArtikelNr].Anzahl:=IntToStr(ArtikelAnzahl); ArtikelAuswahl[ArtikelNr].Name:=LB_Artikel.Items.Strings[ArtikelNR]; 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]
|
|
|