Eingabefeld mit einer Liste die sich unten öffnet

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

bruce85

Betreff: Eingabefeld mit einer Liste die sich unten öffnet

BeitragSa, Dez 16, 2006 6:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin zusammen Laughing

Mir war ein bisschen langweilig, dann hab ich eben mal ein bissel geproggt Smile
Und zwar habe ich ein Input Funktion geschrieben mit einer liste die sich öffnet und anzeigt was man alles schon geschrieben hat und wenn man dann einen der texte anklickt, dann wird dies in das Eingabefeld kopiert.

Hier ist mal der Code, ich habe auch paar Kommentare mit reingeschrieben:
Code: [AUSKLAPPEN]
Graphics 320,240
SetBuffer BackBuffer()

;Schriftart Arial laden
Global schrift = LoadFont("Arial",18,0,0,0)
;Schriftart setzen
SetFont schrift

;Variable für den Text den man eingebt
Global Eingabe$
;Variable i für den erste Position des textes auf 40
Global i=40
;Rect Breite auf 0 setzen
Global rect_breite=0
;Maximale Breite des Rects auf 0 setzen
Global rect_max_breite=0
;Rect Höhe auf 0 setzen
Global rect_hoehe=0
;Text breite auf 0 setzen
Global text_breite
;Die anzahl der texte die eingegeben wurden
Global text_anzahl=0

;Types für die Texte
Type texte
  Field tex$
  Field text_x
  Field text_y
End Type

;Die texte werden ausgeblendet, wenn 1 dann werden die sichtbar
Global anzeigen = 0

;Texte laden
Load()

Repeat
  ClsColor 127,127,127
  Cls

  ;Die Funktion InputRoutine aufrufen
  InputRoutine()

  ;Wenn anzeigen = 1, dann die texte anzeigen
  If anzeigen = 1 Then
    ;Alle texte abfragen
    For t.texte = Each texte
      Color 0,0,0
      ;Rect zeichnen wie gross das Feld insgesamt ist, wo die texte drin sind
      Rect 18,40,rect_breite+4,rect_hoehe,0
      ;Berechnung auf welcher text die maus sich befindet
      If RectsOverlap(MouseX(),MouseY(),1,1,t\text_x,t\text_y,rect_max_breite+2,20) Then
        Color 136,196,255
        ;Rect zeichnen wo die maus gerade auf ein Text zeigt
        Rect 19,t\text_y+1,rect_max_breite+2,18
        If MouseDown(1) And MouseHit(1) Then
          ;Wenn die linke maustaste gedrückt wird,
          ;dann t\tex$ die Variable Eingabe$ zuweisen
          ;umd den Text dann oben anzuzeigen und anzeigen
          ;anschließend auf 0 setzen
          Eingabe$ = t\tex$
          anzeigen=0
        EndIf
      EndIf
      Color 0,0,128
      ;Alle Texte anzeigen die bisher geschrieben wurden
      Text t\text_x,t\text_y,t\tex$
    Next
  EndIf

  If KeyDown(28) And KeyHit(28) Then
    ;Text erzeugen
    t.texte = New texte
    ;Das was eingegeben wurde, übergeben wir die Variable t\tex$
    t\tex$ = Eingabe$
    ;Text X Position immer auf 20 setzen
    t\text_x = 20
    ;i soll Text Y Position übergeben werden
    t\text_y = i
    ;Anschließend i auf 20 erhöhen
    i = i + 20
    ;Text breite ermitteln
    text_breite = StringWidth(Eingabe$)
    ;Wenn noch kein Text vorhanden ist, dann wird das hier ausgeführt
    If rect_max_breite = 0 Then
      ;Rect Breite ermitteln
      rect_breite = StringWidth(Eingabe$)
      ;Dann soll das erstmal die Maximale grösse sein
      rect_max_breite = StringWidth(Eingabe$)
    EndIf
    ;Wenn dann Text breite grösser wie die maximale Rect breite ist,
    ;dann wird das hier ausgeführt
    If text_breite > rect_max_breite Then
      ;Text Breite ermitteln
      rect_breite = StringWidth(Eingabe$)
      ;Dann die neue Rect Breite ermitteln
      rect_max_breite = StringWidth(Eingabe$)
    EndIf
    ;Rect Höhe wird immer um 20 Pixel grösser
    rect_hoehe = rect_hoehe + 20
    ;Eingabe löschen
    Eingabe$ = ""
    ;Text anzahl immer um eins erhöhen
    text_anzahl = text_anzahl + 1
    ;Texte asublenden
    anzeigen = 0
    ;Texte Speichern die im moment in der liste sind
    Save()
  EndIf

  Flip
Until KeyHit(1)

End

;--- InputRoutine ---
Function InputRoutine()

  ;ASC Code ermitteln
  b$ = GetKey()
  ;Text breite und höhe ermitteln
  t_x = StringWidth(Eingabe$)
  t_y = StringHeight(Eingabe$)
  Color 0,0,0
  ;Dann ein Rect zeichnen für den Curser
  Rect t_x+21,t_y+4,2,14
  ;Rect für das Eingabefeld zeichnen
  Rect 18,19,280,20,0
  ;wenn b > 0 dann ausführen
  If b > 0 Then
    ;wenn die Rückteste gedrückt wird, dann wird das hier nicht ausgeführt
    If Not b = 8 Then
      ;wenn die Entertaste gedrückt wird, dann wird das hier nich ausgeführt
      If Not b = 13 Then
        ;ASC Code in Buchstabe umwandeln und diese dann Eingabe$ zuweisen
        Eingabe$ = Eingabe$ + Chr$(b$)
      EndIf
    EndIf
  EndIf

  ;wenn die Rücktaste gedrückt wird, dann wird immer ein Buchstabe gelöscht
  If b = 8 Then
    Eingabe$ = Mid(Eingabe$,1,Len(Eingabe$)-1)
  EndIf

  ;wenn in das Eingabefeld geklickt wird, dann werden die Texte die momentan
  ;in der liste sind, angezeigt
  If RectsOverlap(MouseX(),MouseY(),1,1,20,20,280,20) Then
    If MouseDown(1) And MouseHit(1)
      anzeigen=1
    EndIf
  EndIf

  Color 0,0,128
  ;Input anzeigen
  Text 20,20,Eingabe$

End Function

;--- Speichern ---
Function Save()

  ;Datei Speichern
  Datei = WriteFile("Save.txt")

  ;Text anzahl in Datei schreiben
  WriteLine Datei,text_anzahl
  ;Rect höhe in Datei schreiben
  WriteLine Datei,rect_hoehe
  ;Rect breite in Datei schreiben
  WriteLine Datei,rect_breite
  ;i in Datei schreiben
  WriteLine Datei,i
  ;Die maximale grösse der Rect in Datei schreiben
  WriteLine Datei,rect_max_breite
  ;alle texte abfragen um diese dann zu speichern
  For t.texte = Each texte
    WriteLine Datei,t\tex
    WriteLine Datei,t\text_x
    WriteLine Datei,t\text_y
  Next

  ;Datei schließen
  CloseFile(Datei)

End Function

;--- Laden ---
Function Load()

  ;Datei laden
  Datei = ReadFile("Save.txt")

  ;Wenn Datei nicht 0, dann ausführen
  If Not Datei = 0 Then
    ;Text anzahl von der Datei lesen
    text_anzahl = ReadLine(Datei)
    ;Rect höhe von der Datei lesen
    rect_hoehe = ReadLine(Datei)
    ;Rect breite von der Datei lesen
    rect_breite = ReadLine(Datei)
    ;i von der Datei lesen
    i = ReadLine(Datei)
    ;Die Maximale grösse der Rect von der Datei lesen
    rect_max_breite = ReadLine(Datei)
    ;Alle texte lesen die erstellt wurden, dazu haben wir ja
    ;die Variable Text anzahl benutzt, wieviele texte wir geschrieben haben
    For j=1 To text_anzahl
      ;und dann die Texte erzeugen
      t.texte = New texte
      t\tex = ReadLine(Datei)
      t\text_x = ReadLine(Datei)
      t\text_y = ReadLine(Datei)
    Next
    ;Datei schließen
    CloseFile(Datei)
  EndIf

End Function


Wenn man dann in Das Eingabefeld klickt, dann öffnet sich die liste und wenn man dann ein Text anklickt, dann wird dies in das Eingabefeld kopiert.
Vieleicht kann ja einer was damit anfangen Cool

MfG Andreas
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

snörkl

BeitragMi, Dez 20, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
schade das hier niemand antwortet^^. Also es ist zwar mal wieder eine input funktion^^ (die entwickler könnten ja auch mal mit nem update ne neue bringen die dann auch mal das ständige schreiben von neuen dingern unnötig macht^^), aber ich finds echt genial. Toller einfall Wink

Smily

BeitragMi, Dez 20, 2006 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Es heißt zwar, man soll seine Codes gut Kommentieren. aber DAS scheint mir "etwas" übertrieben. der Code hat mehr Kommentare als Befehle O_o

Ausserdem reicht es, wenn der befehl "clscolor" nur einmal aufgerufen wird, also kannst du den auch Ausserhalb der Schleife machen.


Gruß, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

bruce85

BeitragMi, Dez 20, 2006 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke euch für die Antworten.
Ich hab halt zuviele kommentare geschrieben^^
ist zwar bissel unübersichtlich geworden wegen die ganzen kommis, aber naja^^

Edit: Hast recht, den befehl ClsColor hätte ich auch am anfang hinschreiben können, es macht ja eigentlich nix, wenn es in der schleife steht Very Happy

MfG Andreas
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Smily

BeitragDo, Dez 21, 2006 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz streng genommen doch.
Das Programm führt ungefähr hundert mal in der Sekunde (grob geschätzt) einen Befehl aus, welcher eigentlich keinen sinn hat.
Bei den Heutigen Standarts und einem so kleinen prog macht sich sowas zwar kaum bemerkbar, aber bei größeren Projekten sollte man besser aufpassen, dass einem sowas nicht passiert
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Goodjee

BeitragDo, Dez 21, 2006 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
des weiteren solltest du wenn schon was im feld steht nur einträge anzeigen die mit dem selben buchstaben(oder mehreren buchsrtaben) anfangen anzeigen
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Ironstorm

Erstklassiger Contest-Veranstalter

BeitragFr, Dez 22, 2006 3:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt fehlt noch eine Markierungsroutine und eine Möglichkeit das Menü zu schließen wenn man nichts anklicken will und es ist nicht schlecht.

MFG
Ironstorm
..:: blackbird design : blackbird photography : Futuro Verde : X-Commander ::..
MacBook | Intel Core 2 Duo 2,1 GHz | 2048 MB RAM | 80 GB HDD | Mac OS X 10.6.2 (Snow Leopard) | Adobe CS4 Design Premium

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group