Autor Beitrag
Speedjunkee
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 12.07.2011 um 11:57
Einloggen, um Attachments anzusehen!
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 12.07.11 10:43 
Moin und willkommen im DF! :welcome:

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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
Edit.Enabled:=Checkbox.Checked;					


Viele Grüße

Oliver
Speedjunkee Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 12.07.11 11:12 
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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconGausi: Delphi-Tags hinzugefügt
Oliver Marx
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: 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:

ausblenden 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);
  //Copy kopiert einen Teilstring aus einem gegebenen String raus und liefert ihn als Ergebnis zurück
  //LastDelimiter liefert die Position in einem String zurück vom letzten Vorkommen im String, also in dem Fall die Position, an der "Checkbox" steht
  //vName hat dann in unserem Beispiel die Zeichenkette 'sa'

  TEdit(FindComponent(vName + 'Edit')).Enabled := TCheckBox(Sender).Checked;
  //FindComponent findet die zum Namen zugehörige Komponente und liefert sie als TObject zurück, so dass du sie noch entsprechend casten musst.

  //Sender ist das Objekt, von dem das Ereignis ausgelöst wurde, also die Checkbox, auf die geklickt wurde.
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 12.07.11 14:03 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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);
  //Copy kopiert einen Teilstring aus einem gegebenen String raus und liefert ihn als Ergebnis zurück
  //LastDelimiter liefert die Position in einem String zurück vom letzten Vorkommen im String, also in dem Fall die Position, an der "Checkbox" steht
  //vName hat dann in unserem Beispiel die Zeichenkette 'sa'

  TEdit(FindComponent(vName + 'Edit')).Enabled := TCheckBox(Sender).Checked;
  //FindComponent findet die zum Namen zugehörige Komponente und liefert sie als TObject zurück, so dass du sie noch entsprechend casten musst.

  //Sender ist das Objekt, von dem das Ereignis ausgelöst wurde, also die Checkbox, auf die geklickt wurde.
end;



Kürzen wir mal:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Form1.saCheckboxClick(Sender: TObject);
var
  Component: TComponent;
begin
  Component := FindComponent(StringReplace('Checkbox''Edit', TComponent(Sender).Name));
  if Assigned(Component) Then Component.Enabled := TCheckBox(Sender).Checked;
end;

Funktioniert genauso, hat aber noch ne Fehlerprüfung drinnen, wenn er die Komponente nicht findet.

_________________
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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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.