| Autor |
Beitrag |
Speedjunkee
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 12.07.11 10:41
Hey,
Ich bin 11. Klasse und will über die Sommerferien ein Projekt für die 12. Klasse fertig machen (damit ich dann kurz vorm Abi nicht die Arbeit habe  ). Dazu will ich ein umfangreiches Tafelwerk anfertigen, was Dinge wie zum Beispiel Dreiecksberchnungen und so kann. Im Einzelnen haben wir das im Unterricht schon gemacht aber ich möchte, dass der Benutzer wählen kann welche Werte er vom Dreieck hat und das Programm dann die übrigen ausrechnet.
Dazu habe ich Checkboxen eingefügt. Wenn die Checkbox von Seite a aktiviert ist soll der Benutzer Seite a eingeben können, wenn die Checkbox von Seite b aktiviert ist soll er Seite b eingeben können und so weiter. Alles andere soll für den Benutzer (sofern die Checkbox nciht aktiviert ist) unbenutzbar sein und wird vom Programm nachdem klick auf "Berechnen" ausgefüllt.
Gibt es da eine Anweisung wie ich das realisieren kann?
Screenshot des Programms ist im Anhang.
Vielen Dank für eure Hilfe.
Lg Speedjunkee
edit: Benutze Delphi 7, falls das für die Beantwortung wichtig ist :) Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Di 12.07.2011 um 11:57
Einloggen, um Attachments anzusehen!
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 12.07.11 10:43
Moin und willkommen im DF!
Schau Dir mal die Eigenschaft "Enabled" der Textboxen an.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Speedjunkee 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 12.07.11 10:56
okay.
das ist ja jetzt das sie eigentlich von Anfang bis Ende nicht sichtbar sind wenn ich da False einsetze. Muss ich dann sowas wie
"If Checkbox1.cecked then edit1.text.enabled.true else edit1.text.enabled.false" schreiben!?
edit: danke fürs willkommen heißen 
|
|
Oliver Marx
      
Beiträge: 80
Erhaltene Danke: 18
Win 7 Prof.
Delphi XE Prof.
|
Verfasst: Di 12.07.11 11:02
Hi,
du kannst es einfacherer formulieren, denn du möchtest ja haben, das Edit.Enabled den selben Wert wie Checkbox.Checked hat.
Delphi-Quelltext 1:
| Edit.Enabled:=Checkbox.Checked; |
Viele Grüße
Oliver
|
|
Speedjunkee 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 12.07.11 11:07
ich würde das ja jetzt gern ausprobieren, aber irwie hängt mein projekt jetzt seid dem ich das erste mal die eigenschaft geändert hab :O ich hab sie jetzt bei allen Textboxen auf false aber das prgramm setzt es beim starten nicht um und ich kann weder checkboxen klicken noch zahlen eingeben :O
wisst ihr was ich falsch gemacht haben kann!? (hab auch schon neustart von Delphi gemacht!)
|
|
Oliver Marx
      
Beiträge: 80
Erhaltene Danke: 18
Win 7 Prof.
Delphi XE Prof.
|
Verfasst: Di 12.07.11 11:11
Hi,
kannst du mal deinen Code posten? Ansonsten kann man leider den Fehler nicht so leicht erkennen.
Viele Grüße
Oliver
|
|
Speedjunkee 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 12.07.11 11:12
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, TabNotBk, jpeg, Buttons;
type TForm1 = class(TForm) TabbedNotebook1: TTabbedNotebook; Panel1: TPanel; GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; csa: TCheckBox; csb: TCheckBox; csc: TCheckBox; chc: TCheckBox; cha: TCheckBox; chb: TCheckBox; cwa: TCheckBox; cwb: TCheckBox; cwg: TCheckBox; Image1: TImage; Label10: TLabel; cf: TCheckBox; Label11: TLabel; cu: TCheckBox; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; esa: TEdit; esb: TEdit; esc: TEdit; eha: TEdit; ehb: TEdit; ehc: TEdit; ef: TEdit; eu: TEdit; ewa: TEdit; ewb: TEdit; ewg: TEdit; Panel2: TPanel; BitBtn1: TBitBtn; BitBtn2: TBitBtn; procedure BitBtn1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject); begin if csa.Checked then esa.Enabled:=true; end;
end. |
den meinst du sicher oder?
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
Oliver Marx
      
Beiträge: 80
Erhaltene Danke: 18
Win 7 Prof.
Delphi XE Prof.
|
Verfasst: Di 12.07.11 11:23
Hi,
ja, danke. Kann aber jetzt keinen Fehler entdecken, der zu diesem Fehler führen kann und habe momentan kein Delpi bei mir.
Allerdings kannst du mit deinem bisherigen Code nur esa.Enabled auf True setzen, aber nicht auf False.
Viele Grüße
Oliver
|
|
Speedjunkee 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 12.07.11 11:26
okay. danke für die Hilfe
dann werde ich wohl die Oberfläche nochmal machen müssen, ältere Projekte funktionieren einwandfrei...
|
|
Oliver Marx
      
Beiträge: 80
Erhaltene Danke: 18
Win 7 Prof.
Delphi XE Prof.
|
Verfasst: Di 12.07.11 11:34
Hi,
du musst wahrscheinlich nicht die ganze Oberfläche neu machen. Ist denn die Prozessorauslastung bei 100%? Vielleicht hast du auch nur bei einer falschen Komponente Enabled auf False gesetzt. Weiß grad nicht mehr so genau, ob auch die Form ein Enabled hat. Dieses müsste auf jeden Fall während der Ausführung True sein!
Viele Grüße
Oliver
|
|
Kay E.
      
Beiträge: 118
|
Verfasst: Di 12.07.11 13:30
Du setzt gerade das Enabled der Edit-Felder, wenn der Benutzer auf einen BitButton klickt. Es sollte doch aber so sein, dass die Editfelder unbenutzbar werden sollen, wenn die Checkbox nicht angekreuzt ist. Also muss das ganze in das OnCHange-Ereignis der Checkboxen.
Um den Quellcode kürzer zu machen, kannst du für jedes Checkbox-OnChange-Ereignis die gleiche OnCHange-Prozedur benutzen. Dazu ist es aber sinnvoll, die Komponenten entsprechend zu bennenen. Zum Beispiel wenn du die Checkbox mit Namen saCheckbox hast und das dazugehöroige Editfeld saEdit nennst. Wenn du die anderen Pärchen entsprechend benennst, kannst du folgenden Code generell verwenden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure Form1.saCheckboxClick(Sender: TObject); var vName: string; begin vName := Copy(TCheckbox(Sender).Name, 1, LastDelimiter('CheckBox', TCheckBox(Sender).Name) - 1); TEdit(FindComponent(vName + 'Edit')).Enabled := TCheckBox(Sender).Checked; end; |
Der Code müsste eigentlich so funktionieren, ich hab ihn grad blind (ohne Delphi) geschrieben. Kann sein, dass das '-1' bei Copy weg muss, das hab ich grad nicht im Kopf.
Bei den anderen Checkboxen musst du beim OnChange-Ereignis dann das obige auswählen. Damit greifen dann alle Checkboxen auf diese Prozedur zu. Das ganze ist aber schon n bissl Objektorientierter, also wenn dus für die Schule simpel hälst und für jede Checkbox ein eigenes Ereignis schreibst, wird dir sicher niemand bös sein
Andere Ansätze, die noch eleganter wären, wären a) eine Ableitung von TCheckbox, zu dem man ein property hinzufügt, in das man das entsprechende Editfeld einträgt und so über das Property ausschalten kann oder b) die Komponenten in eine Liste eintragen und dann über den Index auf das Editfeld zugreifen kann. Das erspart beides eine Umbenennung der Komponenten.
Nur so, um dir einfach mal zu zeigen, was noch alles möglich ist.
Grüße
Kay
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 12.07.11 14:03
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Kay E.
      
Beiträge: 118
|
Verfasst: Di 12.07.11 14:16
Da sieht man mal wieder: Es gibt keinen Code, den man nicht verbessern kann
Jetzt hab ich auch noch was mitgenommen!
|
|
Speedjunkee 
Hält's aus hier
Beiträge: 9
|
Verfasst: Fr 15.07.11 13:00
okay. Ich hab glaub ich verstanden wie das funktioniert.
Aber es sind trotzdem noch ein paar fragen offen.
Wenn ich die Komponenten so benenne wie ihr vorgeschlagen habt und dann den Quelltext übernehme kommen 3 Fehlermeldungen:
'Bezeichner redefiniert "Form"'
'Undefinierter Bezeichner "FindComponent"'
'Undefinierter Bezeichner "Sender"'
Kann es sein das es die Anweisungen Sender und FindComponent in Delphi 7 noch nicht gibt?
Außerdem weiß ich nicht wie man eine OnChange Prozedur einleitet. Ich hab versucht im Objektinspektor eine Checkbox auszuwählen, dann im reiter "Ereignisse" OnChange auszuwählen. Das Ereigniss finde ich nur bei den Editkomponennten also hab ich versucht OnClick auszuwählen. ABer wie man dann ein Ereignis erzeugt ist mir unklar
lg
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Fr 15.07.11 13:21
Einfach doppelt in das OnClick-Ereignis klicken und schon wird dir Code erzeugt und du kannst arbeiten.
An welcher Stelle kommt das Bezeichner redefiniert?
FindComponent ist in der Unit Classes zu Hause. Die sollte standardmäßig in der uses-Klausel eingebunden sein.
Bei deinem Post ist sie das auch.
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|