![]() |
Delphi-Version: 10.2 Tokyo
Inhaltsabfrage in Delphi 10.2
Guten Tag liebe Community,
und zwar bin ein gnadenloser Anfänger im Bereich Delphi und beschäftige mich nun seit ein paar Tagen damit. Ich wollte fragen, ob es irgendwie eine Abfragemöglichkeit gibt, um in einem Memo (z.B.) nach bestimmten Charakteren zu suchen. In meinem Fall erstelle ich zum Üben einen Taschenrechner, der dem bei Windows ähnelt. Wird hier eine die "Kommataste" gedrückt, soll ein Komma erscheinen, jedoch bei erneutem Betätigen nicht. Ich bin gerade nicht sicher, wie ich das angehen soll. Vielen Dank für eure Hilfe! |
AW: Inhaltsabfrage in Delphi 10.2
Pos/PosEx(), StrScan(), ...
Delphi-Quellcode:
if Pos( ',', Memo.Lines.Text) < 1 then //Noch kein Komma
|
AW: Inhaltsabfrage in Delphi 10.2
Hallo,
beim OnKeyPress des Memos kannst du Key=#0 setzen, dass verhindert, dass das Zeichen in das Memo eingetragen wird. Jetzt noch davor die Prüfung siehe der Thread über mir. |
AW: Inhaltsabfrage in Delphi 10.2
Vielen Dank für deine Antwort. Problem hat sich somit gelöst!
|
AW: Inhaltsabfrage in Delphi 10.2
Zitat:
![]() ![]() ![]() ![]() ... oder andersrum ![]() ![]() ![]() ![]() |
AW: Inhaltsabfrage in Delphi 10.2
Liste der Anhänge anzeigen (Anzahl: 1)
@himitsu - auch dir ein Danke.
Hätte noch eine Frage, die aber nicht zum Thema passt - hoffe es ist okay, wenn ich sie gerade hier stelle: Und zwar habe ich das bei meinem Taschenrechner so geregelt, dass die Eingabe vom Benutzer in einem TMemo gespeichert wird. Erste Zeile = erste Eingabe, zweite Zeile = Rechenoperator, dritte Zeile = zweite Eingabe - beim Entern dann das Ergebnis in einem Panel. Funktioniert auch alles super, jedoch möchte ich einerseits, dass der Benutzer nur diese sogenannten drei Lines benutzen kann und sollte eine weitere Eingabe erfolgen, rechnet er das Ergebnis aus und nimmt dieses als erste Eingabe (erste Line), aber löscht den Rest (sogesehen: zweite und dritte Line), damit der Benutzer weitereingeben kann. Auch würde ich gerne wissen, wie man das machen kann, dass ins TMemo nur mit Hilfe von Buttons geschrieben wird, da ich zu dumm bin, die Tastatureingabe als Eingabe zu integrieren. Also er funktioniert schon, jedoch übergibt er nicht richtig den Rechenoperator. Screens folgen. Hatte es mir irgendwie so gedacht, dass eine Abfrage der Linesanzahl getätigt wird, weiß nur nicht, wie das zu bewerkstelligen ist.. Vielen Dank vorab! |
AW: Inhaltsabfrage in Delphi 10.2
Am einfachsten speicherst du deine Eingaben in Variablen (wenn man so will der Speicher des Taschenrechners) und benutzt das Memo nur zur Anzeige. Du musst dir zudem merken, in welchem Zustand der Taschenrechner gerade ist, ob beim Eingebn der 1. Zahl oder der 2. Zahl, abhängig davon ob ein Operator eingegeben wurde usw. usw.
Das Eingeben per Tastatur kannst du erreichen, indem du für das Formular ein entsprechenden OnKeyPress-Event schreibst. |
AW: Inhaltsabfrage in Delphi 10.2
Delphi-Quellcode:
Dann kann man schon mal nicht mehr direkt ins Memo schreiben.
Memo.ReadOnly:=True
Und
Delphi-Quellcode:
liefert dir die Anzahl der vorhanden Zeilen im Memo
Memo.Lines.Count
|
AW: Inhaltsabfrage in Delphi 10.2
Danke euch beiden. Das mit dem OnKeyPress habe ich ausprobiert, ist aber auch bisschen kritisch. Der simpelste Weg ist das mit dem ReadOnly - das klappt gut. Gespeichert sind die Eingaben schon (meiner Meinung nach) in Variablen. Ich hatte mir gedacht, dass eine weitere Variable (csEingabe3) deklariert und mit der dritten Zeile initialisiert wird:
csEingabe3 := resultMemo.Lines[3]; if csEingabe3 = '' then... ..das klappt aber nicht so, da dann direkt die erste Eingabe nicht dem Datentyp entspricht.
Code:
procedure TForm1.enterBtnClick(Sender: TObject);
var neErgebnis : extended; neEingabe1 : extended; neEingabe2 : extended; begin csRechenart := resultMemo.Lines[1]; neEingabe1 := StrToFloat( resultMemo.Lines[0] ); neEingabe2 := StrToFloat( resultMemo.Lines[2] ); if csRechenart = '/' then begin neErgebnis := ( neEingabe1 / neEingabe2 ); resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis ); end; if csRechenart = '*' then begin neErgebnis := ( neEingabe1 * neEingabe2 ); resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis ); end; if csRechenart = '+' then begin neErgebnis := ( neEingabe1 + neEingabe2 ); resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis ); end; if csRechenart = '-' then begin neErgebnis := ( neEingabe1 - neEingabe2 ); resultPanel.Caption := 'Ihr Ergebnis: ' + FloatToStr( neErgebnis ); end; end; |
AW: Inhaltsabfrage in Delphi 10.2
Generell ist dein Vorgehen nicht sehr ergonomisch und fehleranfällig.
Wenn es grundsätzlich um die Aufgabe geht aus zwei Werten eine Ergebnis zu berechnen, dann solltest du die Daten generell auch in entsprechenden Variablen halten, dort auch berechnen und lediglich für die Ausgabe an den User in das Memo schreiben. Bei der Ausgabe kannst du dann auch entsprechend formatieren. Umgekehrt ist das, wie du merkst, deutlich umständlicher. Die Erklärung dahinter ist einfach. Einen Fließkommawert in einen String zur Ausgabe umzuwandeln ist einfach, und dabei kann nahezu nichts schiefgehen. Der String kann alle Zeichen speichern, ob's nun Sinn macht oder nicht. Aber um einen String in einen Fließkommawert zu wandeln, muss man schon deutlich mehr aufpassen. Denn eine Fließkommmazahl unterliegt nun mal ganz strikten Vorgaben (z.B. nur ein Kommazeichen und das richtige Kommazeichen. Keine Buchstaben, Leerzeichen, etc.). Du merkst der Weg über einen String ist etwas schwieriger. |
AW: Inhaltsabfrage in Delphi 10.2
Die Frage ist nur, wie ich diese Werte, die durch einzelne Klicks an das Memo übergeben werden, anders speichern kann. Ich bin gerade zu dumm, um das zu erkennen. Weil, wenn eine 1, eine 4 und eine 5 übergeben werden, kann ich einfach den Wert aus der Line1 übergeben - wie komme ich denn sonst an den Wert, der durch die Klicks zusammengestellt wird? Wie gesagt.. bin Anfänger und sehr verwirrt, haha.
|
AW: Inhaltsabfrage in Delphi 10.2
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal eine kleine Demo für dich gemacht. Da kannst du dir anschauen, wie ich es auf die Schnelle machen würde.
Nicht perfekt, aber da kannst du dir was rausziehen, und es für dich dann perfekt machen. Ich habe dir hier mal die entscheidenden Methoden aufgeführt. Die Aktuelle Zahl halte ich in der Variable Zahl als string (string deshalb, weil ich mir sonst nach dem Komma folgende Nullen merken müsste, bis der Benutzer wenigsten eine Ziffer <>0 eingibt. Daher der Einfachheit halber als string). Die Buttons für die Zahlen und Komma haben alle die btn1Click-Procedure. Ich entnehme jeweils ihrer Caption, um welche Zahl oder Komma es sich handelt. Die Procedure ZahlHinzufuegen übernimmt nun das tatsächliche Hinzufügen. Allerdings müssen hier eben die Sonderfälle berücksichtigt werden, damit immer gewährleistet ist, dass in Zahl ein gültiger Extended-Wert steht. Das Anzeigen mache wieder über eine eigenen Procedure, da ich a) diesen Code an verschiedenen Stellen benötigen würde und b) ich die Methode so klein wie möglich halten will. Also immer wenn sich ein Codefragment mindestens 1x wiederholt, lohnt sich eine eigene Methode dafür. Und übersichtlicher macht's auch. Im KeyPrass filtere ich mir alle Key's und löse entsprechen den Button aus. Ich hätte auch z.B. ZahlHinzufuegen('1'); machen können. Und dann noch eine Procedure für das Löschen von Zahlen. Auch hier muss man immer darauf achten, das in Zahl ein gültiger Extended-Wert verbleibt. Statt Komma füge ich einen Punkt hinzu, weil das das Dezimalzeichen für Fließkommazahlen unter Delphi ist. Das in der Darstellung zu ändern, darum kannst du dir Gedanken machen. Genauso wie über den Fehler, dass man in der Version das Komma mehrmals eingeben kann, was natürlich nicht sein darf. Bitteschön. (Liegt übrigens auch als komplettes Projekt im Anhang)
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin ZahlHinzufuegen((Sender as TButton).Caption); end; procedure TForm1.btnDivisionClick(Sender: TObject); begin Uebertrag(raDivision); end; procedure TForm1.btnMinusClick(Sender: TObject); begin Uebertrag(raMinus); end; procedure TForm1.btnMultiplikationClick(Sender: TObject); begin Uebertrag(raMultiplikation); end; procedure TForm1.btnPlusClick(Sender: TObject); begin Uebertrag(raPlus); end; procedure TForm1.FormCreate(Sender: TObject); begin Zahl:='0'; Ergebnis:=0; RechenArt:=raPlus; AddKomma:=False; mmoAusgabe.Lines.Clear; while mmoAusgabe.Lines.Count<3 do mmoAusgabe.lines.Add(''); WertAufMemo; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Ord(Key) of 8: LoescheLetztStelle; 48, 96: btn0.Click; 49, 97: btn1.Click; 50, 98: btn2.Click; 51, 99: btn3.Click; 52, 100: btn4.Click; 53, 101: btn5.Click; 54, 102: btn6.Click; 55, 103: btn7.Click; 56, 104: btn8.Click; 57, 105: btn9.Click; 42, 106: btnMultiplikation.Click; 43, 107, 61, 12: btnPlus.Click; 45, 109: btnMinus.Click; 47, 111: btnDivision.Click; 44, 188, 190: btnKomma.Click; else Key:=0; end; end; procedure TForm1.LoescheLetztStelle; begin if Length(Zahl)>1 then Zahl:=Copy(Zahl, 1, Length(Zahl)-1) else Zahl:='0'; WertAufMemo; end; procedure TForm1.Uebertrag(NeueRechenArt: TRechenart); begin case RechenArt of raPlus: Ergebnis:=Ergebnis+StrToFloat(Zahl); raMinus: Ergebnis:=Ergebnis-StrToFloat(Zahl); raMultiplikation: Ergebnis:=Ergebnis*StrToFloat(Zahl); raDivision: begin if Zahl<>'0' then Ergebnis:=Ergebnis/StrToFloat(Zahl); end; end; Zahl:='0'; RechenArt:=NeueRechenArt; WertAufMemo; end; procedure TForm1.WertAufMemo; begin mmoAusgabe.Lines[0]:=FloatToStr(Ergebnis); case RechenArt of raPlus: mmoAusgabe.Lines[1]:='+'; raMinus: mmoAusgabe.Lines[1]:='-'; raMultiplikation: mmoAusgabe.Lines[1]:='*'; raDivision:mmoAusgabe.Lines[1]:='/' ; end; mmoAusgabe.Lines[2]:=Zahl; end; procedure TForm1.ZahlHinzufuegen(Eingabe: string); begin if Eingabe='0' then begin if Zahl<>'0' then Zahl:=Zahl+Eingabe else Zahl:='0'; end else if Eingabe=',' then begin if Zahl='0' then Zahl:='0.' else Zahl:=Zahl+'.'; end else begin if Zahl<>'0' then Zahl:=Zahl+Eingabe else Zahl:=Eingabe; end; WertAufMemo; end; |
AW: Inhaltsabfrage in Delphi 10.2
Vielen Dank für deine Mühe!
Ich habe nur das Problem, dass ich mit Embarcadero programmiere und daher die VisualStudios-Datei nicht benutzen kann (kann sein, dass es Wege gibt). Ich schaue mir das mal genauer an und versuche mir an Hand des Quellcodes, mein Wissen zu erweitern. Dank dir :) |
AW: Inhaltsabfrage in Delphi 10.2
Zitat:
Also wenn du meinen Post meinst, dann ist das Delphi pur. Kann natürlich sein, dass du z.B. die .res-Datei mit Doppelklick öffnen wolltest. Die wird ggf. dann mit VS geöffnet. Versuchs mal mit der .dpr oder .proj-Datei. |
AW: Inhaltsabfrage in Delphi 10.2
Habe es genauso versucht. Dann noch anders gespeichert und per Embarcadero versucht, die Datei zu öffnen, wird mir aber nichts angezeigt. Möchte immer direkt mit VS öffnen und es nicht möglich das umzustellen..
|
AW: Inhaltsabfrage in Delphi 10.2
Mit "Visual Studio Code" kann man auf sowas wie OmniPascal aufbauen, ich habe es noch nicht versucht da mir das Original Delphi reicht.
Generell ist Visual Studio eine Programmierumgebung mit Eigener Syntax und Compiler die kein Delphi/Pascal von Hause aus beherrscht. Also Versuche noch mal ganz genau zu erklären was Dein Ziel ist. Ein Delphi Projekt nach VS portieren? Ein VS Projekt nach Delphi portieren? |
AW: Inhaltsabfrage in Delphi 10.2
Zitat:
Zitat:
Wenn du aber lieber VisualStudio (Microsoft), und damit VisualBasic, C# oder C++ möchtest, dann bist du hier geringfügig falsch. Aber dein Code, den du hier zwischendurch mal gepostet hast, ist schon Pascal und damit Delphi. Das ist dir schon klar, oder? Also, noch mal in kürze: - Anhang Demo.zip runterladen. - Demo.zip in ein Verzeichnis entpacken. - Delphi starten - In Delphi "Projekt öffnen", in das Verzeichnis wechseln und Demo.proj oder Demo.dpr öffnen Wenn das nicht geht, hier genau sagen, was nicht geht, welche Fehlermeldung kommt und ggf. noch einen Screenshot anhängen. |
AW: Inhaltsabfrage in Delphi 10.2
Ich bin nicht dumm. Ich programmiere nur mit Embarcadero, aber wenn ich deine Datei öffnen will, möchte das immer mit VisualStudios starten, obwohl ich es nicht mal auf meinem Computer besitze. Wenn ich versuche, das Projekt mit Embarcadero zu öffnen, geht das nicht, da einfach das Projekt nicht angezeigt wird. Ich habe es nie gemeint, dass ich versuche irgendwas mit VisualStudios zu öffnen, sondern es will sich von alleine mit VisualStudios öffnen!
Damit meine ich, dass ich deine Dateien entpackt habe und versucht habe, das Projekt auszuführen. Aber es passiert einfach gar nicht. Es scheint so, als würde es kurz laden, öffnen tut sich aber nichts. |
AW: Inhaltsabfrage in Delphi 10.2
Dann korrigiere die Verknüpfung der entsprechenden Dateitypen.
|
AW: Inhaltsabfrage in Delphi 10.2
Ist jetzt aber auch egal. Ich probiere es nochmal von vorne und danke für eure Hilfe!
|
AW: Inhaltsabfrage in Delphi 10.2
Hallo Leon,
ja das war missverständlich was Du da vorher geschrieben hattest, nun ist ja alles geklärt. Am einfachsten wird es sein wie mkinzler es sagte, korrigiere die Verknüpfungen. Also rechtsklick auf eine .dpr Datei, dann "Öffnen mit...", eventuell steht da sogar schon Embarcadero RAD Studio zu Auswahl, wenn nicht surfe zum Installationsverzeichnis und markiere BDS.exe, noch ein Haken bei "Datei immer damit öffnen" rein und nun sollte alles so sein wie es normalerweise sein sollte. |
AW: Inhaltsabfrage in Delphi 10.2
Liste der Anhänge anzeigen (Anzahl: 2)
Nochmal ein großes Dankeschön für eure Bemühungen. Jetzt habe ich noch ein Problem, haha - ich Problemfall. Und zwar habe ich Labels, die durch ein OnClick Event enabled werden sollen, jedoch werden nicht alle enabled. Im Anhang ist das Bild. Und zwar soll nach Betätigung des 1 Spieler Buttons, der Start-Button benutzbar sein. Dieser aktiviert, je nach Spieler Anzahl, die verschiedenen Elemente. Jedoch sieht man (delphiportal1), dass nur manche Enabled werden und die anderen erst durch Überfliegen mit der Maus enabled sind. Application.ProcessMessages, self.Repaint, self.Update, labelname.Update und Co auch - gerade keine Ahnung mehr :/
|
AW: Inhaltsabfrage in Delphi 10.2
Ohne Deinen Code zu Kennen, wird es schwer Dir zu Helfen.
|
AW: Inhaltsabfrage in Delphi 10.2
Code:
niSpielerNr := 1;
onePlayerSBtn.Enabled := false; twoPlayerSBtn.Enabled := false; startSBtn.Enabled := false; newGameSBtn.Enabled := true; wuerfel1BBtn.Enabled := true; wuerfel2BBtn.Enabled := true; wuerfel3BBtn.Enabled := true; wuerfel4BBtn.Enabled := true; wuerfel5BBtn.Enabled := true; wuerfel6BBtn.Enabled := true; wuerfel7BBtn.Enabled := true; wuerfel1SBtn.Enabled := true; wuerfel2SBtn.Enabled := true; wuerfel3SBtn.Enabled := true; wuerfel4SBtn.Enabled := true; wuerfel5SBtn.Enabled := true; wuerfel6SBtn.Enabled := true; wuerfel7SBtn.Enabled := true; wuerfelnBBtn.Enabled := true; enableSpieler1( true ); wuerfelnBBtn.SetFocus;
Code:
procedure TKnuffel.enableSpieler1(lbEinAus: Boolean);
begin player1CB1er.Enabled := lbEinAus; player1CB2er.Enabled := lbEinAus; player1CB3er.Enabled := lbEinAus; player1CB4er.Enabled := lbEinAus; player1CB5er.Enabled := lbEinAus; player1CB6er.Enabled := lbEinAus; player1CB3Pasch.Enabled := lbEinAus; player1CB4Pasch.Enabled := lbEinAus; player1CB5Pasch.Enabled := lbEinAus; player1CB6Pasch.Enabled := lbEinAus; player1CB2Doppel.Enabled := lbEinAus; player1CB3Doppel.Enabled := lbEinAus; player1CBTrippel.Enabled := lbEinAus; player1CBKFH.Enabled := lbEinAus; player1CBGFH.Enabled := lbEinAus; player1CBMStr.Enabled := lbEinAus; player1CBKStr.Enabled := lbEinAus; player1CBGStr.Enabled := lbEinAus; player1CBKnuffel.Enabled := lbEinAus; player1CBChance.Enabled := lbEinAus; wert1Label1er.Enabled := lbEinAus; wert1Label2er.Enabled := lbEinAus; wert1Label3er.Enabled := lbEinAus; wert1Label4er.Enabled := lbEinAus; wert1Label5er.Enabled := lbEinAus; wert1Label6er.Enabled := lbEinAus; wert1LabelTotal.Enabled := lbEinAus; wert1LabelBonus.Enabled := lbEinAus; wert1LabelGOO.Enabled := lbEinAus; total1Label.Enabled := lbEinAus; bonus1Label.Enabled := lbEinAus; totallyAbove1Label.Enabled := lbEinAus; wert1Label3Pasch.Enabled := lbEinAus; wert1Label4Pasch.Enabled := lbEinAus; wert1Label5Pasch.Enabled := lbEinAus; wert1Label6Pasch.Enabled := lbEinAus; wert1Label2Doppel.Enabled := lbEinAus; wert1Label3Doppel.Enabled := lbEinAus; wert1LabelTrippel.Enabled := lbEinAus; wert1LabelKFH.Enabled := lbEinAus; wert1LabelGFH.Enabled := lbEinAus; wert1LabelMStr.Enabled := lbEinAus; wert1LabelKStr.Enabled := lbEinAus; wert1LabelGStr.Enabled := lbEinAus; wert1LabelKnuffel.Enabled := lbEinAus; wert1LabelChance.Enabled := lbEinAus; wert1LabelGU.Enabled := lbEinAus; wert1LabelGOU.Enabled := lbEinAus; wert1LabelInsgesamt.Enabled := lbEinAus; totallyBelow1Label.Enabled := lbEinAus; totallyAbove3Label.Enabled := lbEinAus; totallyCombined1Label.Enabled := lbEinAus; end; |
AW: Inhaltsabfrage in Delphi 10.2
Hat sich erledigt. Keine Ahnung was ich geändert habe, aber Code war dafür nicht nötig. Kann an überlagernden Checkboxen gelegen habe - wer weiß :D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz