Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[delphi] podstawy składni

DariuszEE 04 Kwi 2011 15:55 2381 19
  • #1 04 Kwi 2011 15:55
    DariuszEE
    Poziom 17  

    Witam
    Mam pytanie jak napisać warunek

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    to znaczy :

    chcę by Timer1 był aktywny tylko gdy jest przyciskany BitBtn1Click
    i ZATRZYMYWANY jak przycisk BitBtn1Click zostanie puszczony

    0 19
  • #2 04 Kwi 2011 16:35
    arnoldziq
    Moderator Programowanie

    Będzie ciężko to zrobić :(
    Najprostsza możliwość, to włączanie i wyłączanie timer-a, przyciśnięciem tego samego Buttona.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    No można to zrobić, robiąc szybką pętlę, która sprawdza stan tego przycisku, ale raczej należałoby zrobić to w osobnym wątku.
    A może powiedz raczej, do czego tego potrzebujesz ? Może jest jakieś inne rozwiązanie ...

    0
  • #3 04 Kwi 2011 16:49
    DariuszEE
    Poziom 17  

    arnoldziq napisał:
    Będzie ciężko to zrobić :(
    Najprostsza możliwość, to włączanie i wyłączanie timer-a, przyciśnięciem tego samego Buttona.
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    No można to zrobić, robiąc szybką pętlę, która sprawdza stan tego przycisku, ale raczej należałoby zrobić to w osobnym wątku.
    A może powiedz raczej, do czego tego potrzebujesz ? Może jest jakieś inne rozwiązanie ...


    Rozumiem
    To zadam pytanie inaczej

    Chcę wysyłać zmienną o wartości od 0 od 255 + $13 "Enter" jako string na COM port i wypisywać wartość odebraną na "Panel1"

    chcę by jeden Button jak trzymamy , zwiększał wartość zmiennej co 250ms i wysyłał
    a drugi Button zmniejszał wartość zmiennej co 250ms i wysyłał

    ALE tylko wtedy gdy się naciska dany BUTTON

    Zrobiłem tak że:

    Utworzyłem zmienną
    wrzuciłem timer=False
    wpisałem w Timer
    zmienna=zmienna+1 i wypisuj na port COM

    zmiana Timer na True


    Więc jak to zrobić inaczej , proszę o jaką radę

    0
  • #4 04 Kwi 2011 17:10
    arnoldziq
    Moderator Programowanie

    No to do czegoś dochodzimy :)
    Możesz obsłużyć zdarzenia OnMouseUp and onMouseDown, żeby wywołać taki efekt.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #5 04 Kwi 2011 18:02
    DariuszEE
    Poziom 17  

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Poradziłem sobie ze skompilowaniem i DZIAŁA :-)
    zapomniałem o zakładce "Events" [ zdarzenia ]

    Bardzo Dziękuję Koledze arnoldziq

    tzn. powiem tak ostatni raz co kolwiek w Delphi tworzyłem 2002 :-)
    sporo mi wyleciało z głowy :-)

    0
  • #6 09 Kwi 2011 02:27
    DariuszEE
    Poziom 17  

    Witam ponownie

    Proszę o radę

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    jak z Stringu usunąć znak końca linii #0D , #0A

    0
  • #8 09 Kwi 2011 12:42
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    StringReplace. Ale jeśli wiesz, że występują zawsze i są tylko na końcu, możesz po prostu obciąć stringa funkcją Delete.


    Dzięki , ale Możesz przypomnieć , bo o tym Pamiętałem , ale coś chyba "chrzanie"

    bo ja piszę

    Code:
    var
    
    Str: StringReplace(String, #10[rfReplaceAll]);
    Begin
    ....


    no i nie mogę skompilować

    0
  • #10 09 Kwi 2011 13:05
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    Po pierwsze: var to sekcja definicji zmiennych a nie pisania kodu.
    Po drugie - F1 nie działa?


    Powiem szczerze że NIE ROZUMIEM panującej na ELEKTRODZIE
    MANIERY POUCZANIA INNYCH że jest HELP i takie tam to wie każdy

    Ponieważ tyle samo CZASU i ENERGII zajęła by Uprzejma i konkretna odpowiedz na TEMAT

    PRZEPRASZAM że zapytałem

    0
  • #12 09 Kwi 2011 20:45
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    Przepraszam, że pomogłem.

    Dodano po 1 [minuty]:

    Naciśnięcie F1 lub poszukanie w Google - 10 sekund
    Czekanie, aż zrobi to za nas ktoś inny: 45 minut...
    http://4programmers.net/Delphi/StringReplace


    1. to znalazłem
    2. nie jestem informatykiem
    3. nigdy się nie uczyłem programowania "w szkole" więc brak mi podstaw a to powoduje kłopoty ze składnią.

    4. to już sobie z tym poradziłem

    ale po za tym to nie rozumiem dlaczego nie działa mi coś takiego

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    a mówiąc prościej

    chcę utworzyć

    1. Zmienną globalną typu byte , ponieważ potrzebny mi tylko zakres 0-255
    2. Button 1 , ma powodować że dodaję do tej zmiennej za każdym naciśnięciem 1
    3. Button 2 , ma powodować że odejmuje do tej zmiennej za każdym naciśnięciem 1
    4. wyświetlać tą zmienną "na" Label1.Caption


    Drugi kłopot to dlaczego Label2.Caption wyświetla ni idiotyzmy , tzn każdy kolejny string nie nadpisuje wartości poprzedniej

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Jak zrobić by

    1. Odbieram np. 0#13#10 1#13#10 2#13#10 , tzn liczbę zmieniającą o wartości 0-255 + #13#10
    i chcę bym tę wartość mógł obserwować to jako "wartość" na Label2.Caption

    0
  • #13 09 Kwi 2011 21:33
    Dżyszla
    Poziom 42  

    1. Zmienne lokalne (definiowane w funkcjach) o tych samych nazwach, co zmienne globalne przykrywają te drugie. Nie definiuj zmiennej w funkcji, jeśli chcesz korzystać ze zmiennej globalnej.
    2. A z portu COM dostajesz liczbę jako wartość czy jako string? Co wyświetla Memo1?

    0
  • #14 09 Kwi 2011 23:07
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    1. Zmienne lokalne (definiowane w funkcjach) o tych samych nazwach, co zmienne globalne przykrywają te drugie. Nie definiuj zmiennej w funkcji, jeśli chcesz korzystać ze zmiennej globalnej.
    2. A z portu COM dostajesz liczbę jako wartość czy jako string? Co wyświetla Memo1?


    ok. zaraz sprawdzę co do zmiennych :-) fakt

    Przez CPU wysyłam string ,
    w ascii tak:

    Dane z CPU na terminalu są takie
    na marginesie POLECAM NAJLEPSZY jaki ZNAM od wielu LAT
    [delphi] podstawy składni
    Link do By Br@y++
    download

    1
    3
    5
    5
    54
    54
    56


    dec

    49
    13
    10
    51
    13
    10
    53
    13
    10
    53
    13
    10
    53
    52
    13
    10
    53
    52
    13
    10
    53
    54
    13
    10

    hex

    31
    0D
    0A
    33
    0D
    0A
    35
    0D
    0A
    35
    0D
    0A
    35
    34
    0D
    0A
    35
    34
    0D
    0A
    35
    36
    0D
    0A

    W memo po "odcięciu" wyświetla mi się
    1|3|5|5|54|54|56|

    Label zachowuje się dziwnie
    pojawia mi się pierwsza liczba
    a kolejne "tak jakby poniżej"

    0
  • #16 10 Kwi 2011 12:34
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    Możesz rozwinąć zwrot "tak jakby później"?


    Poniżej "tekst wychodzi z Labela i wyświetla się tak jakby w kolejnych liniach"

    Zadam pytanie inne
    jak w Delphi przekształcić string w wartość liczbową

    tzn. np. jak odbieramy 1 , 2 , 3 , koniec linii = 123 "dec"

    w Basic-u to się robi

    Liczba:=Val(String)

    i tu już mam liczbę

    Code:
    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
    
    var
    Str, NewStr: String;
    Code: Integer;
    Dana: Extended;       
    begin
    ComPort.ReadStr(Str, Count);
    NewStr:= StringReplace(Str, #13#10, '', [rfReplaceAll]);
    Val(NewStr, Dana, Code);

    Memo1.Text:=Memo1.Text + Dana;
    Label2.Caption:=Label2.Caption + Dana;
    end;


    znalazłem coś takiego Val(NewStr, Dana, Code);
    tylko coś nie bardzo rozumiem jak to zastosować

    Jaką funkcję pełni CODE i DANA , dlaczego nie mogę tak

    Code:
    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
    
    var
    Str, NewStr: String;
    Liczba: Byte;       
    begin
    ComPort.ReadStr(Str, Count);
    NewStr:= StringReplace(Str, #13#10, '', [rfReplaceAll]);
    Liczba:=Val(NewStr);

    Memo1.Text:=Memo1.Text + Liczba;
    Label2.Caption:=Liczba;
    end;


    string może mieć od 1 do 3 znaków "Licznowych" => chcę to zgrupować i przekształcić liczbę ?

    0
  • #18 11 Kwi 2011 02:46
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    Zdebuguj i sprawdź, co jest w tej zmiennej po kolejnych odczytach. Z kodu nie jest możliwe, aby tekst się doklejał do labela.


    OKAZAŁO SIĘ ŻE mój kłopot polega na komponencie portu RS232 w Dephi
    Wysyła ok ale odbiór jest fatalny

    Na sprzętowym RS232 działa wszystko ok.
    Na USB -> RS232 zaczyna świrować dzieją się CUDA

    I Nie wiem co z tym począć ?

    0
  • #20 11 Kwi 2011 11:23
    DariuszEE
    Poziom 17  

    Dżyszla napisał:
    A to przez USB jest? To sprawdź, czy masz sterownik poprawny.


    W końcu już się wkurzyłem i zrobiłem kilka eksperymentów

    Najpierw zacząłem wysyłać dane przez terminal i także było źle
    potem dopisałem do wysyłanych danych #13#10 do wysyłanych i zapętliłem program sprzętowo , i także źle
    W końcu "zapętliłem" dwa wynikowe programy na dwu różnych komputerach i było ok.
    przy czym dobrze jest na komputerze na którym mam RS232 sprzętowy
    więc dodałem Adapter USB -> RS232 do drugiego kompa i okazało się że jest źle.

    Wykonałem następne testy i :

    Na przejściówce USB -> RS232 na kontrolerze PL-2303 nie chce prawidłowo odbierać
    Na przejściówce USB -> RS232 na kontrolerze FT-232FR Działa poprawnie

    Ale na terminalu w przypadku obu rodzaju portów jest poprawnie

    Przy okazji znalazłem kilka błędów u siebie , tzn. odwoływałem się do tej samej zmiennej w dwóch miejscach "wzajemnie zaprzeczając wykonanie" i parę drobnych błędów.

    Program wyglądać ma mniej więcej tak [delphi] podstawy składni

    Poniżej zamieszczam kod
    Jak Któryś z Kolegów możesz to przejrzeć i poprawić błędy , których ja nie widzę to był bym Wdzięczny
    Różnica polega jedynie na tym że CPU zwraca wartość w zakresie 0-100 , dlatego jest b*2
    i odbiera znaki bez znaku który teraz dodałem przy wysyłaniu #10 , do zapętlenia programu

    programik jest maksymalnie prosty
    całość głównie siedzi w CPU
    Programik ma za zadanie

    1. wysłać zapytanie do CPU o aktualnej wartości PWM , CPU zwraca tę wartość już przeliczoną w % , ale bez znaku "%"
    2. Ma wypisać to co odebrał na "Label2.Caption" i "Image1.Width"
    3. Ma wysyłać do CPU wartość PWM w zakresie 0-255
    4. Wypisywać tę wartość zwróconą po wykonaniu przez CPU na "Label2.Caption" i "Image1.Width"
    5. Ma wypisywać także odebrane wartosi w "%" na "Label2.Caption" i "Image1.Width" w przypadku ster lokalnego , tzn. CPU wysyła te dane w tym przypadku.

    6. Dopiszę jeszcze procedurę ON/OFF wysyłaną do CPU , sterownik CPU zapisuje wartość w EEPROM wykonuje polecenie i zwraca wykonanie procedury

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0