| Autor |
Beitrag |
Dennys
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 11.01.12 16:16
Hallo zusammen,
ich bin neu hier und bin mir sicher, ihr habt schon oft das Thema besprochen.
Ich hab auch schon etliches gelesen und ausprobiert, komme aber einfach nicht weiter. Daher meine Bitte an euch mir zu helfen.
Ich möchte auf einem pageControl eine dynamische Anzahl sheets erstellen. Auf jedes Sheet kommt eine Tabelle die mit einer SQL Abfrage verbunden ist.
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:
| var i,anzahl_tabs : integer; kostenstelle : string; mypagecontrol : TspSkinpagecontrol; newSheet:TTabSheet; newGrid : TspSkinDBGrid; begin with q_kostenstellen do begin close; sql.Clear; sql.Add('select * from Kostenstellen where Kostenstelle <> :kst and IS_WEK = 1 order by Kostenstelle'); Parameters.ParamByName('kst').Value := ''; open; anzahl_tabs := RecordCount; kostenstelle := FieldByName('Kostenstelle').AsString; end; try mypagecontrol:=TspSkinpagecontrol.Create(SDIAppForm); mypagecontrol.Parent := SDIAppForm; mypagecontrol.Name := 'pc_kostenstellen'; mypagecontrol.Align := alClient;
for i := 1 to anzahl_tabs do begin with mypagecontrol do begin NewSheet:=TTabSheet.Create(mypagecontrol); newSheet.PageControl:=mypagecontrol; newSheet.Caption:= q_kostenstellen.FieldByName('Kostenstelle').AsString + ';' + q_kostenstellen.FieldByName('Bezeichnung').AsString; newSheet.Name := 'Sheet' + q_kostenstellen.FieldByName('Kostenstelle').AsString; newSheet.parent := mypagecontrol;
newGrid:= TspSkinDBGrid.Create(mypagecontrol); newGrid.parent := newsheet; newgrid.align := alClient; newgrid.ReadOnly := True; newgrid.Name := 'Grid' + q_kostenstellen.FieldByName('Kostenstelle').AsString;
newgrid.DataSource := ds_Bestelldetail; newGrid.Columns.Add; newGrid.Columns[0].FieldName := 'Bereich'; newGrid.Columns[0].Width:= 80; newGrid.Columns.Add; newGrid.Columns[1].FieldName := 'Artikelname'; newGrid.Columns[1].Width:= 200; newGrid.Columns.Add; newGrid.Columns[2].FieldName := 'Artikelnummer'; newGrid.Columns[2].Width:= 100; newGrid.Columns.Add; newGrid.Columns[3].FieldName := 'err_hersteller'; newGrid.Columns[3].Width:= 300; newGrid.Columns[3].Title.caption := 'Hersteller'; newGrid.Columns.Add; newGrid.Columns[4].FieldName := 'Auftragsnummer'; newGrid.Columns[4].Width:= 120; newGrid.Columns.Add; newGrid.Columns[5].FieldName := 'Bestell_Datum'; newGrid.Columns[5].Width:= 120; newGrid.Columns[5].Title.caption := 'Bestellung vom';
end; q_kostenstellen.FindNext; end; finally end;
end; |
Soweit funktioniert das ja ganz vernünftig.
Allerdings und da komm ich nicht weiter, soll beim FormClose alles wieder freigegeben werden
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TSDIAppForm.loesche_komponenten; var i :integer; begin while mypagecontrol.ComponentCount > 0 do begin mypagecontrol.Components[0].free; end; Application.ProcessMessages; end; |
Wenn ich mich auf den sheets aber bewege, also activapageindex <> 0 ist, bekomme ich eine Fehlermeldung und kann es mir einfach nicht erklären
Ich hoffe Ihr könnt mir helfen
Gruß aus Münster
Dennys
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 11.01.12 16:36
Hallo und Willkommen in der Entwicklerecke.
Du solltest Deinen Code in Delphi-Tags packen, dann wird das auch im Forum lesbar: <span class="inlineSyntax"><span class="codecomment">{PROTECTTAGb0cc5c3a7551b3f09f35a4853d220b92}</span></span>
Du musst das beim Schließen eigentlich gar nicht freigeben, denn beim Erstellen hast Du ja den Owner angegeben. Dadurch wird es automatisch freigegeben, wenn der Owner freigegeben wird.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Dennys 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 11.01.12 16:45
Hallo Jens
danke für die schnelle Antwort. Und sorry das ich die Formatierung nicht gemacht hab. Ich stehen aber noch unter Welpenschutz
Aber wenn ich keine Freigabe mache bekomme ich auch eine Zugriffsverletzung und dem Hinweis einer ungültigen Zeigeroperation.
Ich weiss aber nicht wo der Fehler liegen kann...
Gruß
Dennys
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 11.01.12 16:49
Dann zeig mal etwas mehr Code und den genauen Wortlaut der Fehlermeldung und an welcher Stelle sie auftritt.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Dennys 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 11.01.12 17:00
mehr code gibt es nicht.
Ich hab es extra in ein Testprojekt gepackt weil ich erst dachte ich hätte woanders noch einen Zeiger gesetzt und der Fehler gar nicht mit dieser Routine zusammenhängt...
Auftreten tut der Fehler hier:
Delphi-Quelltext 1: 2:
| while mypagecontrol.ComponentCount > 0 do begin mypagecontrol.Components[0].free; |
Fehlermeldung:
Exeption EAccessViolation in Modul... bei 0004653A
Zugriffsverletzung bei Adresse 0044653A in Modul...
Lesen von Adresse 00000020
p.s. ich hoffe ich hab den Code jetzt richtig formatiert... 
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 11.01.12 17:52
PageControl.PageCount gibt dir die Anzahl der Tabsheets in der Pagecontrol
ich würds so machen:
Delphi-Quelltext 1: 2:
| for i := 0 to PageControl.PageCount -1 do PageControl.Pages[i].Free; |
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Dennys 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 11.01.12 18:01
So hab ich es auch schon probiert --> gleicher Fehler
Was ich so komisch finde ist die Tatsache, dass es funktioniert wenn ich nicht auf einen anderen Reiter geklickt habe.
Wechsel ich aber auf einen Reiter und beende dann (rufe also dann die Procedure auf) kommt der Fehler.
Hab auch schon versucht das pagecontrol auf den ersten Reiter zu setzen bevor ich die free Procedure aufrufe aber bringt keine Besserung....
Das kann doch nicht so schwer sein???? 
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.01.12 18:26
|
|
Dennys 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 11.01.12 18:34
gleicher Fehler...
würde es Sinn machen wenn das array von hinten gelöscht wird nicht auf die erste Seite sondern auf die letzte Seite zu gehen bevor man es frei gibt? Moderiert von Narses: Beiträge zusammengefasstwar das PageControlX. ein Tippfehler?
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.01.12 19:02
Dennys hat folgendes geschrieben : | | war das PageControlX. ein Tippfehler? |
Ich schreibe meistens einfach nen X hin, damit da keine 1 dahinter steht, das hat nix zu sagen.
Hier funktioniert das mit Delphi XE jedenfalls problemlos so. Welche Delphiversion hast du denn?
Ich vermute aber, dass der Fehler bei einer der verwendeten Komponenten liegt. Wenn ich da schon sowas wie Skins lese...
|
|
Dennys 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mi 11.01.12 19:25
Hi zuma
das ist ja krass
du hast Recht...
es sind die verwendeten Komponenten....und ich eier seit drei Tagen mit dem Sch... rum
Vielen Dank euch allen!
Gruß
Dennys Moderiert von Narses: Beiträge zusammengefasstLeute
ich bin so blöd...
manchmal sieht man den Wald nicht...
dank des Hinweises von Zuma klappt es dann auch mit meinen externen Komponenten...
ttabsheet ist doch abgeleitet vom pagecontrol
und wenn das eine Komponente ist, ich aber das sheet von der Standardkomponente deklariere kann das ja nicht funktionieren.....
Liegt also nicht an der Komponente sondern an meine Dummheit
Danke noch einmal an euch dreien!!!

|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Do 12.01.12 08:47
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|