Dopisanie danych do RichEdit w aktywnej zakładce PageControl

Odpowiedz Nowy wątek
2018-11-29 16:43

Rejestracja: 4 lata temu

Ostatnio: 2 tygodnie temu

0

Zrobiłem 3 zakładki w PageControl. Procedura

procedure TMainForm.Log(AText : string);
begin
  if AText <> '' then
  begin
    if sPageControl1.ActivePage = Menu then
      LogMemo3.Lines.Add(Format(Log_Format, [FormatDateTime(Time_Format, Time), AText]));

    if sPageControl1.ActivePage = Kategorie then
      LogMemo4.Lines.Add(Format(Log_Format, [FormatDateTime(Time_Format, Time), AText]));

    if sPageControl1.ActivePage = Filmy then
      LogMemo2.Lines.Add(Format(Log_Format, [FormatDateTime(Time_Format, Time), AText]));

    AText := '';
  end;
end;

powinna wyświetlać informacje tylko na jednym RichEdit.

Oprogramowałem funkcję

procedure TMainForm.sPageControl1PageChanging(Sender: TObject;
  NewPage: TsTabSheet; var AllowChange: Boolean);
var
  ThreadId : Cardinal;
begin
  if (NewPage = Kategorie) and (CatLB.Items.Count <= 0) then
    CreateThread(nil, 0, @GetCatThreadProc, Pointer(RefreshBtnHandle), 0, ThreadId);
end;

, gdzie

procedure GetCatThreadProc(Param : Pointer); stdcall;
var
  I : integer;
  DocStr : string;
  CatSL : TStringList;
begin
  with MainForm do
  begin
      EnableWindow(HWND(Param), False);
      CatSL := TStringList.Create;

      Log('Wyszukuję listę kategorii...');
.....

Problem w tym, że jak przełączę się na zakładkę Kategorie, to wyświetla dobrze, ale po zmianie zakładki na inną Wyświetla się też w rej zakładce. Gdzie zrobiłem błąd?

edytowany 2x, ostatnio: furious programming, 2018-11-29 16:58

Pozostało 580 znaków

2018-11-29 16:59
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Tuchów

1

A nie możesz sobie po prostu wyszukać RichEdit na podstawie aktywnej zakładki, czyli ActivePage?

Możesz, więc spróbuj w ten sposób. ;)


edytowany 1x, ostatnio: furious programming, 2018-11-29 16:59

Pozostało 580 znaków

2018-11-29 17:14

Rejestracja: 4 lata temu

Ostatnio: 2 tygodnie temu

0

Można np. by w tablicy trzymać RE i na podstawie ActivePageIndex wyszukać, ale i to wyżej powinno działać.

Pozostało 580 znaków

2018-11-29 18:04
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Tuchów

2

Jeśli RichEdit w każdej zakładce jest pierwszą lokalną kontrolką to nawet nie trzeba będzie szukać:

var
  Edit: TRichEdit;
begin
  Edit := PageControl.ActivePage.Controls[0] as TRichEdit;
  Edit.Lines.Add('value');
end;

Pozostało 580 znaków

2018-11-29 21:32

Rejestracja: 4 lata temu

Ostatnio: 2 tygodnie temu

0

Invalid typecast.

Pozostało 580 znaków

2018-11-29 21:39
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Tuchów

0

Wspaniały opis problemu – mógłbyś się trochę wysilić i podać konkrety.


edytowany 1x, ostatnio: furious programming, 2018-11-29 21:39

Pozostało 580 znaków

2018-11-29 21:50

Rejestracja: 4 lata temu

Ostatnio: 2 tygodnie temu

0
procedure TMainForm.Log(AText : string);
var
  Edit: TRichEdit;
begin
  if AText <> '' then
  begin
    Edit := PageControl.ActivePage.Controls[0] as TRichEdit;
    Edit.Lines.Add(Format(Log_Format, [FormatDateTime(Time_Format, Time), AText]));
  end;
end;

Invalid class typecast. Rozumiem, że wszystkie tabOrder muszą wynosić 0?

edytowany 2x, ostatnio: xenix33, 2018-11-29 21:58

Pozostało 580 znaków

2018-11-29 22:13
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Tuchów

2

Skoro tak, to w aktywnej zakładce pierwszą kontrolką nie jest ta, której oczekujesz. Wystarczy dodać warunek (lub skorzystać z debuggera, co jest lepsze), aby się tego przekonać:

if PageControl.ActivePage.Controls[0] is TRichEdit then
{..}
xenix33 napisał(a):

Rozumiem, że wszystkie tabOrder muszą wynosić 0?

Ta właściwość służy do czegoś zupełnie innego – do ustalania kolejności podczas przenoszenia fokusa Tabem.

Otwórz plik .dfm formularza i przenieś dane dotyczące TRichEdit na górę każdej sekcji danych dla TTabSheet. A jak nie chcesz tego robić, to po prostu zaznacz wszystkie kontrolki znajdujące się na danej zakładce (oprócz TRichEdit), wytnij je i wklej ponownie, na koniec zapisz zmiany. To spowoduje, że designer zreorganizuje wewnętrzną kolejność kontrolek, dzięki czemu TRichEdit znajdzie się na początku listy, co będziesz mógł zobaczyć po otwarciu pliku .dfm.

A jeśli mimo to nie chce Ci się modyfikować kolejności kontrolek, to zmień kod metody i zamiast właściwości Controls, użyj FindChildControl i szukaj TRichEdit na podstawie nazwy. Tylko nazwij sobie je w odpowiedni sposób, aby w ogóle dało się to zrobić.


Jak widzisz, masz kilka opcji. Sam wybrałbym zaznaczenie, wycięcie, wklejenie i zapisanie zmian, bo potrwa to raptem dwie sekundy i jest bezpieczniejsze, niż ręczna edycja pliku z zawartością formularza.


edytowany 6x, ostatnio: furious programming, 2018-11-29 22:24

Pozostało 580 znaków

2018-11-29 22:31

Rejestracja: 4 lata temu

Ostatnio: 2 tygodnie temu

0

Dzoęki. Popróbuję.
Niestety. Problem jest w czymś innym. Dalej wypisuje mi z thread Log() w 2 zakładkach..

To na pewno dobrze napisane? Chcę , aby po przełączenu na zakładkę kategorie automatycznie wyświetlało mi listę.

procedure TMainForm.sPageControl1PageChanging(Sender: TObject;
  NewPage: TsTabSheet; var AllowChange: Boolean);
var
  ThreadId : Cardinal;
begin
  if (NewPage = Kategorie) and (CatLB.Items.Count <= 0) then
    CreateThread(nil, 0, @GetCatThreadProc, Pointer(RefreshBtnHandle), 0, ThreadId);
end;

Nie ta funkcja. Powinna być

PageControl1Change

Wszystko teraz ok. Jeszcze raz dzięki.

edytowany 6x, ostatnio: furious programming, 2018-11-30 14:32
Na pewno zadziała. Dla pewności sprawdziłem pod Lazarusem. - furious programming 2018-11-29 22:36

Pozostało 580 znaków

Odpowiedz

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