Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Jeszcze raz ten nieszczęsny wpis w labela
Tamgo




Typ: neutral
Postów: 129
Zarejestrowany: Aug 2004
Jeszcze raz ten nieszczęsny wpis w labela

Ten przykład, który mi podałeś DJK jest dobry, jednak w moim przypadku nie do końca on się sprawdza.
Nie bulwersuj się, przeczytaj proszę do końca.
Wynika to z faktu, że dane są liczbami całkowitymi i różnej długości ułamkami dziesiętnymi. Użytkownik wpisuje je na podstawie projektu architektonicznego, więc w każdym przypadku ich ilość i wielkość jest inna. Zrobiłem miejsca (właściwość Width) w jednym wierszu na 50 znaków łącznie ze spacjami.
W efekcie co powien czas (zależnie od ilości i rodzajów wpisów) miałem sytuację, że nie mieszczący się wpis w wierszu był przenoszony do kolejnego wiersza, po czym dokonując kolejnego wpisu, ostatnio wpisana (przed nią)wartość była "zjadana" - zwyczajnie znikała - a na jej miejsce "wchodziła" ta aktualnie ostatnia. Później było już dobrze do momentu, gdy analogicznie miało nastąpić zawinięcie z drugiej do trzeciej linii.
Doszedłem do wniosku, że jednak trzeba to uwzględnić i podzieliłem jedną labelę na dwie.
Uzależniłem też miejsce wpisu od ilości zajętych miejsc w linii i od długości ostatniego wpisu w linię. Nie wiem czy to zrozumiałe, obejrzyj źródło.

Option Explicit

Dim X As Integer
Dim a, wynik As Single
Dim b, ile, dalej As String

Private Sub cmdPa_Click()
a = txtPss
  If txtPss.Text = "" Then  'to na szybkiego żeby nie przeszkadzał pusty text
    txtPss.SetFocus
    Exit Sub
  Else
    wynik = wynik + a
    lblPas.Caption = wynik
    b = a & Chr(47)
      If Len(ile) > X Then    ' jeśli przekroczysz 45 miejsc
        If Len(b) <= 3 Then  ' jeśli ostatni wpis wiersza ma......
          ile = ile & b
          Label2.Caption = ile
        Else                  ' jeśli jest inaczej to wpisuj do nowej labeli
          dalej = dalej & b
          Label3.Caption = dalej
        End If
      Else
        ile = ile & b
        Label2.Caption = ile
      End If
  txtPss = ""
  txtPss.SetFocus
  Label1.Visible = True  ' text info - co to za liczby pokazuje w labelu
End If
End Sub

Private Sub Form_Load()
X = 45
End Sub

Mam świadomość, że to nie jest doskonałe, na razie działa ale......ja jeszcze wiele nie wiem, więc spójrz na to.
Mnie się wydaje, że najpewniej byłoby uzależnić prawidłowość wpisów od ilości wpisów - kliknięć buttona. Bo 10 najróżniejszych wpisów śmiało wejdzie w jeden wiersz. Tylko jak "przekonać" labela, żeby następne dajmy na to 10, przyjmowała w drugim wierszu?
A tak apropo's, obaj z Marcinem używacie funkcji konwertującej. Pytanie:
Czy jest lepsza i z jakiego powodu od zadeklarowania od razu zmiennej jako stringa?

02-02-2005 18:22
Pokaż profil Tamgo  Wyślij email do Tamgo        4484571
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Nie wiem co jest nie tak z tym fragmentem kodu, który ci podałem bo on był odporny na różnej długości wpisy także nie wiem co jest nie tak ale mało wążne - prawde pisząc to pisałem go na szybko także może i masz rację

Jeżeli zmienną masz zadeklarowaną jako String to nie musisz używać funkcji konwertujacej - w sumie w ogóle nie musisz jej używać (choc czasami jest to niezbędne) - chodzi tylko o poprawny zapis

Label1.Caption - jest stringiem
A - jest integerem

Także zapis Label1.Caption = A - jest z logicznego punktu widzenia niepoprawny bo powinien wyskoczyć komunikat "Type Mismatch" - no na szczęście VB sam konwertuje typy

Jak znajdę trochę czasu spróbuję coś wykombinoać

Może podaj jakieś założenia żebym wiedział co i jak

P.S.Czemu założyłeś drugi post ?

[Post edytowany dnia 03-02-2005 12:29 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

03-02-2005 12:28
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Tamgo




Typ: neutral
Postów: 129
Zarejestrowany: Aug 2004

Jak by tu najkrócej. Więc tak.
Okno programu: do obliczania wartości długości całkowitej obrzeża dachu.

Gł. obiekty:

textbox - wartość wpisana; label - wynik dodawania; label - podgląd wartości wpisanej; buttony: Dodaj, Popraw, Oblicz, Cofnij, Przepisz - istotne teraz są Dodaj i Cofnij

Schemat działania:

textbox Wpis => button Dodaj => Label Wynik => Label Podgląd wpisu.

Podgląd konieczny, bo jak ktoś Userowi przerwie w podliczaniu i musi później dokończyć, to ja od razu wiszę.

button Cofnij - nie wspominałem lecz brany pod uwagę, bo jeśli User w połowie dokona błędnego wpisu, to ja po raz drugi wiszę.

Sedno:
Ilość znaków w jednym wierszu jest losowa - nie do jednoznacznego określenia. Wyznaczona jest tylko max ilość znaków w wierszu. Określiłem ją (właściwość Width) w jednym wierszu na 50 znaków łącznie ze spacjami.

Zatem raz może być:
12,33/2,33/1,9/2,0/9,5/16,22/5,44/7,22/9,11/1,55/  czyli 49 znaków

a innym razem:
1,77/8,22/5,1/4,5/7,52/4,65/4,33/5,55/9,12/1,5/ będzie 47 znaków
i w tym wypadku jest krytycznie, bo wpisując np: 5,11/ - czyli 5 znaków, jeśli nie będzie ograniczenia ostatniego wpisu w wierszu, dopisze mi
"5,1", a drugą część tego wyrażenia "1/" przeniesie do drugiego wiersza.
Co działo się w labelu?
W twoim rozwiązaniu program - spójrz na przykład wyżej, ostatni wpis "5,11/" - przenosił go do drugiego wiersza, do tego miejsca było OK. Ale gdy wpisywałem kolejną wartość np; "2,33/", to likwidował wpis "5,11/", a w jego miejsce wstawiał "2,33/" - tu mi właśnie opadły ręce.
Nie wiem, może źle coś wpisałem - ustawiłem w FormLoad X na 50, zaś zmiennej przypisałem wg twojego schematu X = X + 51.

Wracając do wspomnianej funkcji Cofnij, nie chciałem nią zawracać głowy, jednak trzeba brać pod uwagę jej istotę, ona tam musi być. Najgorzej, że w tej sytuacji nic nie przychodzi mi do głowy. Musi cofać tylko jeden wpis, warunek: powinna się dać wykonać jeden raz po każdym dodaniu - to wystarczy - ale przecież musi korygować i wpis, i wynik.

Chciałem dodać, że mam jedno gotowe rozwiązanie, jest tragicznie proste , bo oparte na instrukcji wyboru "Select case", lecz zajmuje mi ok. 55 dodatkowych linijek kodu . No i opóźnia działanie programu o tych "parę" milisekund. Jednak ma dużą zaletę. Nie komplikuje mi konstrukcji funkcji Undo, lecz ułatwia. Gdy popatrzyłem, co można zrobić ze stringami, to pomyślałem, że ktoś mi pomoże zrobić coś znacznie prostszego, sam niestety jeszcze nie potrafię.

Zapytasz po co tyle zabawy? Najważniejszy jest wynik, on decyduje o wielu innych istotnych obliczeniach dachu. Ale nie mniej ważny jest komfort pracy Usera, bo inaczej na cholerę mu komputer. Dlatego nie może być pudła.
Za wszelkie sugestie będę bardzo wdzięczny
P.S drugi post?? szczerze mówiąc chyba w przeświadczeniu, że w tym poprzednim było dużo tekstów i bałem się, że już nikt nie zajrzy - chyba to było bez sensu.

[Post edytowany dnia 03-02-2005 18:06 przez Tamgo]

03-02-2005 17:53
Pokaż profil Tamgo  Wyślij email do Tamgo        4484571
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Hmmm - w takim razie coś źle przepisałeś

Po pierwsze: nie wiem czy zauważyłeś ale w moim przykładzie nie ma w ogóle uwzględnionego znaku "/" co oznacza, że X=X+51 już odpada bo ta jedynka uwzględniała tylko Chr$(0) - w takim razie powinieneś dać chyba 52 - naprawdę nie wiem jakie to da efekty bo nie analizowałem tego dokładnie.

Po drugie nie wiem jakim cudem nadpisuje ci pierwszą wartość w nowym wierszu.

Do wykonanie Cofnij wystarczy jedna zmienna zapamiętująca długość ostatniego wpisu i funkcja

Left(Label1.Caption, Len(Label1.Caption) -Zmienna)

Jak znajdę trochę czasu to coś wykombinuję

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

03-02-2005 18:09
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

A mam jeszcze jedno pytanie

Czy do Textboxa wpisujesz za każdym razem pojedyńczą liczbę (1,11) czy cały ciąg wartości (1,11/2,34....) ??


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

03-02-2005 19:31
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

spróbuj tego:

Const X = 50
Dim Y As Integer
Dim sValue As String

Private Sub Form_Load()
Y = X
End Sub

Private Sub cmd_Add_Click()
Call Add
End Sub

Private Sub Add()

sValue = "/" & Text1.Text

If Len(Label1.Caption & sValue) < Y + 1 Then
    If Label1.Caption = "" Or Right$(Label1.Caption, 1) = Chr$(13) Then
        Label1.Caption = Label1.Caption & Text1.Text
    Else
        Label1.Caption = Label1.Caption & sValue
    End If
Else
    Label1.Caption = Label1.Caption & String$(Y - Len(Label1.Caption), " " & Chr(13)
    Label1.Caption = Label1.Caption & Text1.Text
    Y = Y + X + 1
End If

End Sub



_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

03-02-2005 21:59
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Tamgo




Typ: neutral
Postów: 129
Zarejestrowany: Aug 2004

Dzięki DJK za odpowiedź, co prawda jutro wyjeżdżam służbowo, ale skopiowałem sobie twój zapis i będę ostro główkował. Obiecuję teraz niczego nie spaskudzić.

Co do texa, to wpisuję do niego typowe wartości matematyczne - po prostu dodaję kolejno wymiary z projektu. Ten ukośnik - może trochę nim zamieszałem, chcę nim oddzielać wpisane i dodane już wymiary - będą łatwiej czytelne.
Nie dziw się, ja sporo rzeczy jeszcze nie łapię, bo to nie jest taka łatwa sztuka. Mam nadzieję, że kiedyś będę mógł pomóc komuś innemu.
Na razie dzięki, w sieci będę już w poniedziałek. pozdrawiam

03-02-2005 23:04
Pokaż profil Tamgo  Wyślij email do Tamgo        4484571
Tamgo




Typ: neutral
Postów: 129
Zarejestrowany: Aug 2004

Niestety, nie chciało dobrze działać - nadpisywało mnie podwójnie wpisy. Pozostałem jednak przy dwóch odrębnych labelach - to działa dobrze. Rozwiązałem funkcję Cofania, że tak powiem połowicznie.
Popatrz jak to rozwiązałem:

To jest dla Buttona DODAJ

Private Sub ButDod_Click()
a = TxtDlug
  If TxtDlug.Text = "" Then    ' to na szybkiego żeby nie przeszkadzał pusty text
    TxtDlug.SetFocus
    Exit Sub
  Else
    wynik = wynik + a
    wynik = Format(wynik, "0.00"
    EtCaldl.Caption = wynik
    b = a & Chr(47)
    OstKlik = Len(b)            ' zmienna pamiętająca ostatni wpis
    Label3.Caption = OstKlik
      If Len(ile) > X Then      ' jeśli nie przekroczysz 55 miejsc
        If Len(b) <= 3 Then    ' a ostatni wpis wiersza ma......
          ile = ile & b
          Label1.Caption = ile  ' to wpisuj w Label1
        Else                    ' a jeśli przekroczysz 55 miejsc
          dalej = dalej & b    ' a ostatni wpis miał .......
          Label2.Caption = dalej ' to wpisuj do Label2
        End If
      Else
        ile = ile & b
        Label1.Caption = ile    ' tu zawsze wpisuj gdy powyższe warunki nie są spelnione
      End If
  TxtDlug = ""
  TxtDlug.SetFocus
End If
End Sub


a to jest dla Buttona COFNIJ

Private Sub ButCof_Click()
If Label2.Caption = "" Then      ' Jeśli Label2 jest pusta
  If Label1.Caption = "" Then    ' i Label1 jest pusta
    info ("Nie można cofnąć"
    Exit Sub                      ' wiadomo co
    Else                        ' w innym wypadku
      ' odejmij ostatnio dodaną ilość znaków - OstKlik
      COF = Left(Label1.Caption, Len(Label1.Caption) - OstKlik)
      Label1.Caption = COF
      ile = COF                  ' Uwzględnij różnicę - pomniejsz zmienną o OstKlik
      TxtDlug.SetFocus
    End If
Else      ' czyli jeśli Label2 nie jest pusta
COF = Left(Label2.Caption, Len(Label2.Caption) - OstKlik)  ' to dotyczy już Label2
Label2.Caption = COF
ile = ile & COF                  ' Tu jest ten problem
End If
End Sub


Jeśli nie powiążę zmiennej "ile" ze zmienną COF, to po powtórnej próbie wpisu "wyczyści" mi obie labele i dokona tylko ostatniego wpisu. Ale w takiej postaci jak widać (niebieskie) to z kolei ładnie mi wykasuje ostatni "niechciany" wpis, ale po powtórnym dodaniu, nadpisuje mi ten "wyrzucony" plus ten ostatni. Jak sobie z tym poradzić?
Za pomoc będę wdzięczny

[Post edytowany dnia 08-02-2005 18:46 przez Tamgo]

08-02-2005 18:41
Pokaż profil Tamgo  Wyślij email do Tamgo        4484571
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

To w takim razie ja nie wiem co ty tam wpisujesz skoro nadpisywało ci podwójne wpisy o_O - u mnie to działa bez zarzutów


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

08-02-2005 22:26
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Tamgo




Typ: neutral
Postów: 129
Zarejestrowany: Aug 2004
Kurde......

DJK, ty się nie denerwuj, sam nie wiedziałem czemu u mnie tak działa, zadecydował oczywiście przypadek. Zauważyłem, że zastosowane przeze mnie w zupełnie innym projekcie "podróbki" buttonów z checkboxów dziwnie się zachowują. Tak jakby podwójnie klikają. W tym, gdzie stosowałem twój przykład, też użyłem "podróbek" (dla ForeColor). Więc zmieniłem tego jednego (Dodaj) na buttona i okazało się, że jest OK !! Nie wiem czemu tak się działo, dałem im (checkboxom) kody w "książkowy sposób", żeby pracowały jak buttony. Najważniejsze, że wszystko jest OK. I z cofaniem sobie świetnie poradziłem - oczywiście z twoją pomocą, dzięki. Mam nadzieję, że temat wyczerpany.

09-02-2005 16:32
Pokaż profil Tamgo  Wyślij email do Tamgo        4484571
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Nie no nie denerowałem się tylko bardzo zdziwiłem

A co do "podróbek" jak to nazwałeś to radzę używać standardowych kontrolek póki ich możliwości zapewniają zrealizowanie tego co chcemy uzyskać - też kiedyś postanowiłem skorzystać z tekich kontrolek i wszystko byłoby OK dopóki dopóty przyszło skompilować projekt - okazało się że w skompilowanym projekcie - nie wiadomo czemu ich działanie było zupełnie inne od oczekiwanego - dlatego nie korzystam z żadnych dziwnych kontrolek - zawsze można samemu coś wykombinować bez ich używania

Pozdrawiam

[Post edytowany dnia 09-02-2005 17:05 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

09-02-2005 17:04
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Wszystkich odpowiedzi: 10 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1