Ergebnis 1 bis 16 von 16

Thema: Delphi Projekt - Hilfe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Delphi Schulprojekt

    Also, ich hab jetzt so langsam die einfachsten Grundlagen von Delphi verinnerlicht, kenn aber noch nicht viele Komponenten, bzw. ihre Einbindungsweisen. Da mir das Proggen aber Spaß macht, will ich jetzt anfangen mich neben der Schule zu verbessern und dabei gleichzeitig mir das eine oder andere kleine Tool schreiben. Auch wenn die nich viel können werden, ich hab zweifachen Nutzen davon.
    Als erstes etwas größeres Projekt will ich mir ein Tool schreiben, einen ID3-Tag Editor, der folgendes können soll:

    - Anzeige eines Arbeitsplatzes in einer Treeview sowie den Ordnerinhalt in einem seperaten Fenster (am besten nur *.mp3, und *.wma)
    - Laden der ID3 Tags per Doppelklick
    - editierte Tags und Dateinamen per Button speichern
    - und, damit ich lerne wie Dialoge antworten, ein Exit, dass nachfragt, ob beendet werden soll

    Ich hoffe es findet sich hier jemand, der einem begeisterten Anfänger unter die Arme greifen will, damit er sich steigert. Das heißt, ich werde wohl ziemlich oft einige Fragen stellen.

    Meine ersten wären: Wie bringe ich eine Treeview dazu, den Inhalt des Arbeitsplatzes auszugeben? Und welche Komponente sollte ich wählen, um die Dateien anzuzeigen?

    Geändert von Pyrokar (18.03.2005 um 21:36 Uhr)

  2. #2
    Erstmal mein Lieblingslink zu Delphi (www.dsdt.info). Dort findest du auch die Jedi CL/VCL mit über 300 Komponenten in einem schlanken Packet. Das ist übrigend die offizielle seite zu dem Jedi Projekt. Damit sollten sich alle deine Fragen beantworten da es genau masgeschneiderte Komponenten für deine Probleme gibt

  3. #3
    Das Jedi-Projekt ist ja, so wie ich es verstanden hab, ne tolle Sache, aber ich kann das Paket nich installieren. Das Skript gibt mir immer die folgende Meldung aus: "Installation of **** faild. Try running the Installer again. If it still doesn't work, try doing a manual install from Delphi." Tja, was könnte da schief gegangen sein? Und ich kann doch nich 300 Komponenten manuell installieren, da geh ich doch kaputt. Woran könnte das denn nu liegen?

    Und noch ne andere Frage: Wir wollen in der Schule jetzt ein großes Projekt anfangen, wo der ganze Kurs zusammen arbeitet, ein Teil als Proghger, einige Vertrieb usw. Also unser Lehrer will die ENtstehung eines Programms mit uns durchspielen. Ich gehör zu den Proggern: Da ich diese Woche krank bin, wollte ich schon zu Hause etwas machen, da auch jetz 2 Wochen Ferien sind. Wie bekomm ich denn ein Tabcontrol dazu auf ein OnChange Ereignis mit nem Wechsel des Panels zu reagieren? Oder ist das gar nich der ideale Weg einzelne Reiter einer Tabcontrol mit Panels zu füllen? Ich fand die ganz praktisch, weil man auf ein Panel diverse Sachen legen kann. Aber nu mein Problem: Ich will über die folgenden Zeilen einen Panel-Wechsel machen:
    Code:
    procedure TForm1.TabControl1Change(Sender: TObject);
    begin
    if tabcontrol1.TabIndex:=0 then
     panel1.show;
     panel2.Hide;
    end;
    
    if tabcontrol1.TabIndex:=1 then begin
     panel2.Show;
     panel1.hide;
    end;
    end;
    Aber das Projekt lässt sich nicht starten, und gibt den Fehler: "Ausdruckstyp muss BOOLEAN sein." aus, wobei die dritte Zeile markiert ist.

  4. #4
    Code:
    tabcontrol1.TabIndex:=0
    // ....
    tabcontrol1.TabIndex:=1
    Das Zeichen := ist der Zuweisungsoperator. In den obigen Zeilen würdest du also tabcontrol1.TabIndex einen Wert zuweisen. Der Ausdruck hinter einem If muss aber ein boolean-Ausdruck sein, also ein Ausdruck der wahr oder falsch ist. Eine Zuordnung ist weder wahr noch falsch. Du musst den Vergleichsoperator = verwenden..

    Code:
    tabcontrol1.TabIndex = 0
    // ...
    tabcontrol1.TabIndex = 1

  5. #5
    Danke, ich habs gepackt.

  6. #6
    Und weiter gehts: Ich will einen Datentyp TPerson deklarieren, soweit auch kein Problem, aber ich will eine Public-Variable Namens pupils deklarieren, die vom Typ TPerson ist. Das soll so sein, damit in jeder Unit auf dies Variable zugegriffen werden kann, weil unser Schulprojekt wohl mehrere enthalten wird. Das Problem ist, dass die Zuweisung pupils:array of TPerson im Test VOR der Erstellung des Datentyps steht. Was tun?

  7. #7
    Erstell doch einfach ne Unit wo du alle deine "Nicht-Klassen" Typen deklarierst.
    Code:
    unit [Projectname]_Types;
    
    interface
    
    types
      TSex= (sxMale, sxFemale);
    
      TPerson= record
        Age: Integer;
        Sex: TSex;
      end;
    
      //Haufenweise anderer
    
    implementation
    end.
    Danach bindest du diese in alle benötigten bereiche ein.

  8. #8
    Ich hab jetzt ne zweite Unit erstellt, nach deinem Vorbild. Muss es ganz sicher types heißen? Oder wie binde ich diese Unit dann ins Projekt ein. Und wie benenne ich sie um? Ich trag zwar oben wo du nen anderen Namen eingetragen hast auch einen ein, aber angezeigt wird sie immernoch als Unit 2. Und das Prog bleibt immernoch nicht ausführbar.

  9. #9
    Der Unitname wird beim Speichern automatisch vergeben. Sprich machst du die neue Unit, Speicherst diese gleich unter dem gewissen namen (der eigentlich schnurz-piep ist, du solltest sie nur wiedererkennen) und der Titel ändert sich automatisch... dann erst schreibst du in ihr herrum. In der Unit wo sie gebraucht wird fügst du sie einfach oben bei "uses" dazu...

    Code:
    uses
      Classes, Forms, ComCtrls, SysUtlils, [...], Project_Types;
    Types war ein tippfehler =/

  10. #10
    So, nu müsste eigentlich alles funktionieren, aber wie zu erwarten, tut es das nicht. Ich will das Tool testweise starten, aber jetzt hängt er sich am letzten "end." auf und sagt folgendes:
    "Bezeichner redefiniert: 'Finalization'". Was zum Teufel heißt das? Ich hau hier mal den Code der Unit1 rein:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls, Project1_Typen;
    
    type
      TForm1 = class(TForm)
        TabControl1: TTabControl;
        Panel1: TPanel;
        levorname: TLabeledEdit;
        lenachname: TLabeledEdit;
        btnDSspeichern: TButton;
        btnNeuerDS: TButton;
        btnNaechsterDS: TButton;
        btnVorherigerDS: TButton;
        Panel2: TPanel;
        GroupBox2: TGroupBox;
        leWF2: TLabeledEdit;
        leWF3: TLabeledEdit;
        leWF4: TLabeledEdit;
        leWF5: TLabeledEdit;
        leWF6: TLabeledEdit;
        leWF7: TLabeledEdit;
        leWF1: TLabeledEdit;
        Panel3: TPanel;
        GroupBox1: TGroupBox;
        leDoppel1: TLabeledEdit;
        leDoppel2: TLabeledEdit;
        leFach4: TLabeledEdit;
        leFach5: TLabeledEdit;
        leFach3: TLabeledEdit;
        procedure TabControl1Change(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private-Deklarationen }
      public
        pupils:array of TPerson;
        end;
    
    var
      Form1: TForm1;
    
    end
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.TabControl1Change(Sender: TObject);
    begin
    if tabcontrol1.TabIndex=0 then begin
     panel1.show;
     panel2.Hide;
     panel3.Hide;
     end
    else if tabcontrol1.TabIndex=1 then begin
     panel2.Show;
     panel1.hide;
     panel3.Hide;
    end
    else if tabcontrol1.tabindex=2 then begin
     panel3.Show;
     panel2.Hide;
     panel1.Hide;
    end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    tabcontrol1.TabIndex:=0;
    panel2.Hide;
    panel1.show;
    setlength(pupils,1);
    end;
    
    end.
    Und hier mal den der Unit Project1_Typen:
    Code:
    unit Project1_Typen;
    
    interface
    
    type
    TPerson = record
         vorname,name,dfach1,dfach2,fach3,fach4,fach5:string[30];
         punkte:array[1..12,1..4] of integer;
    end;
    implementation
    
    
    
    end.
    Noch ne Frage: Kann ich eigentlich beim array punkte den integer auf 2 Stellen beschränken? Zwecks Speicherreduzierung.

  11. #11
    Mach aus dem Integer ein Byte... dann hast du`s wenigstens nur bis 255. Ansonsten versuch mal in deinem TabControl1Chance Event folgendes:

    Code:
    procedure TForm1.TabControl1Change(Sende  r: TObject);
    begin
     panel1.Hide;
     panel2.Hide;
     panel3.Hide;
     case TabControl1.TabIndex of
      1: Panel1.Show;
      2: Panel2.Show;
      3: Panle3.Show;
     end;
    end;
    Das man 2 else hinter ein if setzen kann währ mir neu... ausserdem...
    Wenn du die PageControl Komponente anstatt der Tabkontroll verwendest ersparst du dir das abfragen und Zeigen/Verstecken von Panels. Die macht das automatisch.

  12. #12
    Ok, das wäre mir ganz recht, weil wohl noch ein paar Reiter hinzukommen werden. Aber wie kann ich nu einer Pagecontrol sowas wie Tab-Strings zuweisen? Ich find die entsprechende Eigenschaft nicht.
    Und meinst du, dass ansonsten mit der Caso-of Wendung das Problem mit der Finalization behoben ist? Hab ich jetzt nämlich nicht ausprobiert, weil ich gleich den Pagecontrol einbauen will.

    EDIT: Habe es mit der Case-of Wendung nochmal probiert, geht zwar theoretisch, er hängt sich aber immer noch am Finalization-Fehler auf.

    Geändert von Pyrokar (17.03.2005 um 11:42 Uhr)

  13. #13
    Rechtsklick auf die Komponente (also da wo du sie auf deiner Form gesetzt hast) und "Tab hinzufügen". Der fehler liegt warscheinlich an dem end vor implementation (Unit1). Das gehört da nicht hin.

  14. #14
    Und weiter gehts: Wie veränder ich die Caption der Tabsheets einer Pagecontrol? Da sollen andere Sachen stehen.

    EDIT: Und ich will eine Datei anlegen, die alle Daten des Feldes pupils speichern kann. Die muss ich doch zum Beipiel bei Public Deklarationen bekannt machen, und zwar so:
    logfile: file of pupils; - oder nicht?
    Ganz richtig scheint es nicht zu sein, denn er sagt, pupils sei ein undefinierter Bezeichner. Aber ich habe den doch vorher vereinbart.

    EDIT2: Ich glaub ich hab den Fehler bei EDIT gefunden. Ich muss den file so definieren:
    logfile: file of TPerson;

    EDIT3: Jetzt will ich ne Procedure schreiben, die das Laden aus dem logfile übernimmt. Der Übersicht wegen will ich die Procedure, da ja noch mehrere folgen, in eine unit Project1_Prozeduren auslagern. Allerdings verweigert das Programm dann den Start, weil ich in der Procedur den logfile benutze, der in Unit1 deklariert wurde. Er wird als undefinierter Bezeichner angegeben.
    Wenn das alles zu verwirrend ist, dann schick ich dir mal den Project-Ordner, dann kannst du es nachvollziehen.

    Geändert von Pyrokar (17.03.2005 um 15:26 Uhr)

  15. #15
    Die Captions eines Tabsheets lässt sich genauso veränder wie jegliche andere Caption auch oÔ

    In Project1_Procedures fügst du deine Project1_Types hinzu. Deine Procedure in _Procedures sollte dann wie folgt aussehen:

    Code:
    Procedure SavePersonsData(FileName: String);
    var
      FileBin: File of TPerson;
    begin
      // hier dein "Schreib das in File" Code
    end;

  16. #16
    Das Problem ist aber, dass ich die Variable logfile benutze, die in unit1 deklariert wird, wegen der unit Project1_Typen meckert er gar nich. Ich stells mal rein:
    Code:
    unit Project1_Proceduren;
    
    interface
    
    uses
    Project1_Typen; //wenn ich hier unit1 angebe meckert er
    
    
    implementation
    
    procedure positionieren(datensatz:integer);
    var aktdatensatz: TPerson;
    begin
     if (datensatz<0) or (datensatz>=filesize(logfile)) then exit;
     else bgein
          seek(logfile, datensatz);
          read(logfile,aktdatensatz);
          txtvorname.text:=aktdatensatz.vorname;
          txtnachname.text:=aktdatensatz.nachname;
    
     end;
    
    
    end.
    Wenn ich unit1 bei uses hinschreib, dann kommt "überkreuzter Bezug zweier Units auf unit1"

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •