Menu PopUp, obsluga myszki, arkusz ala Excel, okna dialogowe

Odpowiedz Nowy wątek
2007-01-07 01:21
0

Zanzaczam ze temat wyjatkowo umiescilem w tym dziale ze wzgledu na to ze w noobie usuwane sa tematy po 30 dniach.

Jestem w trakcie tworzenia prostego progamu do wykreslania krzywych Beziera – jednak ze względu na to że jestem poczatkujacy mam powazne problemy z zagadnieniami podstawowymi i szukam optymalnych rozwiazan oraz przykladów ich zastosowania.
Ponizej zamieszczam screen z programu i link do powiedzmy dzialajacej wersji:
http://83.18.241.202/krzywebeziera//Screen.JPG

http://krzywebeziera.glt.pl/Project1.exe

Chcialby aby była natychmiastowa reakcja na zmiane pol TEdit (gorny prawy rog formy)– czyli wprowadzenie innych wartosci niż domyslnie tam wpisane, zrealizowane mam to tak :

procedure TForm1.SiatkaEchange(Sender: TObject); // aby nastapilo natychmiastowe „uaktualnienie plotna" SiatkaE to pole TEdit
begin
   Przerysuj; //procedura przerysowania plotna
end;

Tylko pytanie – jak zabezpieczyc się przed blednym podaniem danej – czyli zamiast liczby znaku literowego – pole jako takie jest „tekstowe” ? I druga sprawa – co zrobic żeby można było klawiszem backspace usuwac poprzednia wartosc? Bo wstawiajac takei cos do Change wywala mi obecnie program.

Jak utworzyc dodatkowe okno które pojawi się i do ktorego należy wprowadzic dane ewentalnie zatwierdzic opcje etc a które wstrzyma na chwile dzialanie procedury z ktorej zostalo wywolane a nastepnie powroci do niej? Np. okno do wprowadzania nr pkt i jego nowych wspolrzednych? Chwilowo mam efekt taki ze np. pojawia się okno ale procedura jest dalej wykonywana. Chciałbym np. dodatkowe okno pojawiajace się w przypadku opuszczania programu gdy sa wprowadzone jakies dane a grozilaby ich utrata (niezapisane).

No i na razie najpowazniejszy problem - obsługa myszki. Obecnie wstawianie punktow i usuwanie klikajac na paintboxie realizowalem przez OnClick – tyle ze to nie pozwala chyba na bardziej wyrafinowane – albo raczej moja wiedza na to nie pozwala  Domyslam się ze rozwiazaniem jest – przechwytywanie zdarzen : OnMouse UP, DOWN, MOVE. Chciałbym także odzielic dzialanie klawiszy myszy lewy oraz prawy - aby prawy sluzyl do wyswietlenia menu kontekstowego (podrecznego). Czy moglby ktos zamiescic gotowy przykład ? I przy okazji pytanie – co się stanie jeśli istnieja obok siebie procedury korzystajace z PaintboxOnClick oraz PaintboxMouseDown – tzn wykonane zostana obie procedury, jedna z nich?

Kolejna sprawa wiaze się posrednio z powyzszym - sprawa obsługi danych ala Excel. Dzialanie procedur realizujacych algorytm tworzenia krzywych opiera się na zastosowaniu tablic skladajacych się z rekordow:

 type
  typ = record                                                                // wspolrzedne dowolnego punktu zapisujemy w postaci rekordu
  x: integer;                                                                   // wspolrzedna x dowolnego punktu
  y: integer;                                                                   // wspolrzedna y dowolnego punktu
I tak mam zdefiniowane 3 tablice
  pkt1:array[1..1000] of typ;                                                   // pkt1 - tablica punktow kontrolnych
  pkt2:array[1..1000] of typ;                                                   // pkt2 - tablica punktow posrednich
  pkt3:array[1..1000] of typ;                                                   // pkt3 - tablica punktow ostatecznych - koncowych

Jedną z nich jednak chciałbym udostepnic uzytkownikowi programu do „wgladu” – czyli aby mogl na ekranie obserwować zawartość jedenj tabeli. I tu pytanie z czego skorzystac? Myslalem o skorzystaniu z StringGrid – tyle ze chciałbym żeby osoba uzywajaca program mogla za posrednictwem takiego pseudoarkusza dodawac, uswac dowolny wiersz (ze wspolrzednymi x,y) – np. podobnie jak w excelu wciskajac prawy klawisz myszki pojawilo się menu A tam „wstaw” „usun” i aby można wprowadzac i edytowac wspolrzedne.
Czy w zwiazku z tym konieczne jest zastosowanie kolejnego menu popup które się pojawi wylacznie gdy zdarzenie MouseDown dotyczy StringGrida? Czy może jest jakies lepsze rozwiazanie – inny komponent? Jeśli to możliwe prosilbym o przyklady podobnych problemow i ich rozwiazania.

Mam również pytanie odnosnie obslugi przez delphi schowka oraz formatu jpg – stworzylem procedury które pozwalaja na skopiowanie do schowka lub zapisujace do pliku jpg to co tworzone jest na plotnie – problem w tym ze obraz zapisywany w jpg jest jakby wyprany z kolorow – tak jakby przy zapisywaniu inne odcienie powstawaly czerwony kolor krzywej niejest wcale taki soczysty– czy da się cos z tym zrobic?

Przewijanie memo – stworzyłem rowniez memo (przycisk Pomoc) w którym widnieje spora dawka tresci – w zamyslnie krotki help co i jak w porgramie – chciałbym jednak ze względu na ilosc tekstu zrobic memo przewijane – dadalem scroollbar tylko teraz problem mam jak opisac aby srolowaniu towarzyszylo przesuniecie tekstu w memo w dol lub w gore tj jak wypelnic:

procedure TAboutBox.ScrollScroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin

end;

Trzeba chyba skorzystac z ScrollPos i na tym konczy się moja skromna wiedza  Czy moglby ktos wyjasnic zapis:
Memo.Perform(WM_VSCROLL,SB_LINEDOWN,0);
Memo.Perform(WM_VSCROLL,SB_LINEUP,0);
Wiem ze jest standardowo do memo scroll – ale co gdybm chcial sam taki stworzyc?

I narazie ostatni z problemow - StatusBar – Chciałbym aby w pasku stanu widnial panel które można kliknac i zmienić wartosc typu bolean – i aby zmieniala się zawartos panelu – tj z podswietlonej na nie podswietlona (identycznie jak np. w wordzie zmiana jezyka itp. Tyle ze tu tylko dwie wartosci – opcja katywna nie aktywna) Ile maksymalnie może być paneli? Nie wiem czemu ale mnie wysypuje się gdy tworze wiecej niż 4 :(

Dzieki z gory za cierpliwosc w czytaniu tego tesiemca i za wszelkie uwagi, wskazowki podpowiedzi :)

Pozostało 580 znaków

2007-01-07 04:27
0

wpisywanie do edita tylko cyfr http://www.festra.com/eng/snip05.htm

backspace i błąd, w

procedure TForm1.SiatkaEchange(Sender: TObject); // aby nastapilo natychmiastowe „uaktualnienie plotna" SiatkaE to pole TEdit
begin
Przerysuj; //procedura przerysowania plotna
end;

najpierw sprawdz, czy Siatka.Text <> '' albo w Przerysuj zamiast StrToInt(Siatka.Text) daj StrToIntDef(Siatka.Text, 0);

Form.ShowModal - wstrzyma wykonywanie programu dopóki nie zostanie zamknięte okno "Form"

No i na razie najpowazniejszy problem - obsługa myszki. Obecnie wstawianie punktow i usuwanie klikajac na paintboxie realizowalem przez OnClick – tyle ze to nie pozwala chyba na bardziej wyrafinowane – albo raczej moja wiedza na to nie pozwala  Domyslam się ze rozwiazaniem jest – przechwytywanie zdarzen : OnMouse UP, DOWN, MOVE.

to może napisz co to jest to "bardziej wyrafinowane"

co się stanie jeśli istnieja obok siebie procedury korzystajace z PaintboxOnClick oraz PaintboxMouseDown – tzn wykonane zostana obie procedury, jedna z nich

OnClick zostaje wywołane przy puszczeniu klawisza myszy a OnDown przy naciśnięciu, więc najpierw OnDown a następnie OnClick

więcej jutro bo już późno :)


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2007-01-07 15:35
0

Dzieki wielkie za odpowiedz Misiekd - jestem pod wrazeniem ze sie komus chcialo to czytac :D Wyszla mi jeszcz jedna sprawa w trakcie - import i eksport danych do schowka systemowego - dane w postaci tekstowej:
1
6
96
139
77
309
266
309
275
140
329
91
373
231

gdzie pierwsza cyfra to kontrolna - ze dane sa poprawne, druga to ilosc pkt a nastepne to wpsolrzedne x,y konkretnego pkt - i tu problem jak to zapisywac i wczytywac ze schowka. Wyczytalem:

Dziś zajmiemy się schowkiem.Czasami jest on przydatny w programach np. edytor tekstów, ale również pozwala na zaoszczędzenie pamięci - możemy w nim przechowywać (do czasu:)) różne informacje.Najpierw do listy modułów należy dopisać Clipbrd, potem pozostaje już zadeklarowanie zmiennej:
kod w delphi:

var Schowek:TClipboard;
....oraz utworzenie obiektu:
kod w delphi:
var Schowek:=TClipboard.Create;

Jeśli chcemy coś zapisać w schowku, robimy to tak:
kod w delphi:
Schowek.AsText='Gujet';

....odczytujemy odwrotnie:
kod w delphi:
Label.Caption:=Schowek.AsText;

Tyle ze ja akurat potrzebuej odczytywanie kolejnych lini - jak wiec wyslac do schowka tekst z lamaniem wiersza i jak to potem wczytywac?

A odnosnie wpisywania tych cyfr- bardzo przydatne tyle ze mam jeszcze problem - te pola w domysle nie moga byc tez zupelnie puste czyli nie moze przyjmowac wartosci zero lub wartosci backspace bo wtedy wyklada mi sie program :(

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0