[delphi] kopiowanie i wklejanie fragmentu tekstu

0

Witajcie ;)

Dopiero zaczęłam się uczyć Delphi i gwoli treningu wymyśliłam sobie projekt, który co i rusz mnie przerasta. Projekt ma być banalny, najpierw ma się pojawić formularz powitalny z możliwością wyboru trzech równań nieliniowych. Kliknięcie guzika odpowiadającego któremukolwiek z równań będzie przenosić do kolejnego formularza, w którym będą zbierane parametry równań, przedział wartości x i skok (tj. różnica np. między x0 a x1). Program zwracałby wyniki obliczeń w postaci tabeli lub wykresu. Na razie chcę, żeby wyświetlał w kolejnych linijkach. To tak w skrócie.

Aktualnie utknęłam na takim zagadnieniu. Chciałabym mieć możność wycięcia, skopiowania lub wklejenia fragmentu tekstu, przez kliknięcie np. przycisku na pasku narzędziowym. Przeglądając wypowiedzi wujka Google znalazłam różne podpowiedzi, ale żadna albo nie działa, albo (jeszcze) jej nie rozumiem. Używam Delphi XE.

Przeczytałam, że CopyToClipboard, CutToClipboard, PasteFromClipboard nalezą do klasy TRichEdit. Stworzyłam sobie zmienną Edytor należącą do tej klasy i popisałam procedury w stylu:

procedure TForm1.CutButtonClick(Sender: TObject);
begin
     with Edytor do
   begin
   Edytor.CopyToClipboard;
  end;
end;

procedure TForm1.CopyButtonClick(Sender: TObject);
begin
    Edytor.CopyToClipboard;
end;

procedure TForm1.PasteButtonClick(Sender: TObject);
begin
    Edytor.PasteFromClipboard;
end; 

Kompilator nie wyrzuca błędów, program się uruchamia, ale gdy chcę zaznaczyć tekst i wciskam np. przycisk "Kopiuj" wyświetla się błąd "Access violation at address 004757E3 in module 'wartosci_rownan.exe'. Read of address 00000258".
Co powinnam zrobić? Coś dopisać w tym module .exe? Ale co? Kompletnie tego nie rozumiem...

Druga kwestia jest taka - jak opisać w kodzie zaznaczenie fragmentu tekstu (nie tylko w komponencie TEdit, ale też TMemo i TLabel), celem skopiowania go, a potem usunąć zaznaczenie?

Byłabym wdzięczna za pomoc i pozdrawiam...

0
Niśka napisał(a)

Przeczytałam, że CopyToClipboard, CutToClipboard, PasteFromClipboard nalezą do klasy TRichEdit. Stworzyłam sobie zmienną Edytor należącą do tej klasy i popisałam procedury ...

Te procedury, a właściwie metody, występują zarówno w TRichEdit, jak również TMemo i TEdit.

Zastanawia mnie to "Stworzyłam sobie zmienną...".
**TRichEdit **nie jest zwykłą zmienną (jak np. Integer, czy String), ale jest obiektem i nie wystarczy zwykła deklaracja

var
  Edytor: TRichEdit;

Myślę (zgaduję), że na tym poprzestałaś i stąd błąd podczas wykonywania programu, bo próbujesz się odwołać do zmiennej, obiektu, który nie istnieje
Musisz również stworzyć instancję tego obiektu (klasy) poprzez wywołanie jego metody TRichEdit.Create. Można to zrobić w ten sposób

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edytor:= TRichEdit.Create(Self);
  Edytor.Parent:= Self;
  Edytor.Left:= 10;
  Edytor.Top:= 10;
end;

Jeszcze mała, ale ważna uwaga: każdy obiekt, który tworzymy samodzielnie, musimy również samodzielnie zniszczyć. Tak więc potrzeba jeszcze

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Edytor.Free;
  Edytor:= nil;
end;

Wszystkiego, co wcześniej napisałem, można uniknąć po prostu umieszczając daną kontrolkę (w tym przypadku typu TRichEdit) na formularzu podczas projektowania aplikacji. Wówczas tworzeniem i niszczeniem obiektu zajmie się Delphi

Jeśli chodzi o programowe zaznaczanie tekstu oraz kasowanie zaznaczenia, to dostępne są metody:
SelStart
SelLength
ClearSelection

0

Dzięki ;)
Jako bardzo początkująca w tym temacie, nie wiedziałam, że w klasie TRichEdit nie deklaruje się zmiennych ttak, jak np. w klasie TForm (mam na myśli deklarację w stylu Form:TForm).
Dzięki jeszcze raz, zaraz wypróbuję ;)

0
simplex napisał(a)

Wszystkiego, co wcześniej napisałem, można uniknąć po prostu umieszczając daną kontrolkę (w tym przypadku typu TRichEdit) na formularzu podczas projektowania aplikacji. Wówczas tworzeniem i niszczeniem obiektu zajmie się Delphi

Tak też zrobiłam (wersja najprostsza - i co ślepemu po oczach, nie mogłam znaleźć wśród zakładek komponentu TRichEdit).
Błędu już nie wypluwa - ale i nie działa. Czy procedury, które napisałam w pierwszym poście, sa prawidłowe? Czy może czegoś im brak? (Poza zaznaczeniem tekstu oczywiście.) A może nie wystarczy zaznaczenie myszką fragmentu w polu TEdit, tylko trzeba to napisać w procedurze?

0

Tak na marginesie:

     with Edytor do //niepotrzebne
   begin //niepotrzebne
   Edytor.CopyToClipboard;
  end; //niepotrzebme

I następnym razem daj kod w znacznikach <delphi>

0

Jeszcze raz. (Można tutaj edytować swoje posty?).

Jeśli dobrze zrozumiałam. Mogę teraz kopiować, wklejać i wycinać teksty z pola TRichEdit. Mały problem, pozamieniać wszystkie dotychczasowe pola.
Ale mam pytanie kolejne. A jak kopiować tekst z komponentu TLabel? Da radę?

0

Co ślepemu po oczach, nie zauważyłam tego znacznika. (I nie domyśliłam się, że jest takowy, bo jak bym się domyśliła, to bym wpisała.)
Dzięki!
A te wiersze niepotrzebne - one mi się ostały po próbach stworzenia większej całości (rozpaczliwe próby wprowadzenia przykładów podpatrzonych w internecie). Oczywiście, są nieprzydatne.

0

Aby skopiować dowolny tekst do schowka (np z TLabel) trzeba dodać do **uses **moduł Clipbrd. Zawiera on zmienną Clipboard, dzięki której można kopiować do schowka tekst, ale nie tylko, np bitmapy też. Przykład

procedure TForm1.Button1Click(Sender: TObject);
begin
  Clipboard.AsText:= Label1.Caption;  // Kopiowanie do schowka
  Edit1.PasteFromClipboard;
end;

Posty oczywiście można edytować, ale tylko po zalogowaniu. Tych, które napisałaś bez logowania niestety nie możesz już edytować

0

Simplex, dzięki ogromne, jutro wypróbuję ;)
I dzięki za informację o możliwości edytowania postów, człowiek się uczy całe życie ;)

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