Zmiana w Memo2, aktualizacja Memo1

0

Witam, mam taki programik:
do memo1 wczytuje z pliku liczby w takiej formie
212
31231231
3231

2313123
4324
213

35465676
54324
432

Program dynamicznie tworzy mi nowe memo do którego wkłada liczby dopóki nie znajdzie pustej linii, jak na nią trafi to tworzy następne memo i tam lądują następne liczby.
Teraz pytanie: jak zrobić żeby po zmianie liczby w dynamicznie utworzonym memo automatycznie liczba ta była zmieniana w głównym memo1? Czyli coś jakby aktualizacja zmiany.
Wklejam kod programu chociaż jest on bardzo zagmatwany :)

 
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls, SynEdit;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    PageControl1: TPageControl;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1;
  plik : TextFile;
  MyText : String;
  m,n,i,l,liczby,licznik:integer;
  tab: array [ 1 .. 100 ] of string;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  zakladka: TTabSheet;
  memo: TMemo;
  edit: TEdit;
begin
  licznik:=1;
  Memo1.Clear;

if OpenDialog1.Execute then
        begin
        AssignFile(plik, OpenDialog1.FileName);
        Reset(plik);

        while not eof(plik) do
                begin
                    Readln(plik, MyText);
                    tab[licznik]:=MyText;
                    Memo1.Lines.Add(MyText);
                end;

        CloseFile(plik);
        end;

 m:=1;
 n:=1;
 l:=1;
 liczby:=1;
 zakladka:= TTabSheet.Create(self);
 zakladka.PageControl:= PageControl1;
 zakladka.Caption:= 'L' + IntToStr(liczby);
 zakladka.Show;
 //tworzenie pierwszego TMemo
 memo :=TMemo.Create(Self);
 memo.Align := alClient;
 memo.ReadOnly:=False;
 memo.ScrollBars:=ssBoth;
 memo.WordWrap:=false;
 memo.Parent := zakladka;
 //tworzenie pierwszego TEdif
 edit:=TEdit.Create(Self);
 edit.Align:=alBottom;
 edit.ReadOnly:=True;
 edit.Parent:=zakladka;
 //kopiowanie liczb z Memo1 do poszczególnych memo
 for I := 0 to Memo1.Lines.Count-1 do
  begin
       if (Memo1.Lines[i]<>'') then (PageControl1.ActivePage.Controls[0] as TMemo).Lines.Add(Memo1.Lines[i]);

       if Memo1.Lines[i]='' then //jak znajdzie pusta linie to tworzy nowa zakladke z memo
               begin
                          zakladka:= TTabSheet.Create(self);
                          zakladka.PageControl:= PageControl1;
                          zakladka.Caption:= 'L' + IntToStr(liczby);
                          zakladka.Show;
                          //tworzenie Tmemo
                          memo := TMemo.Create(Self);
                          memo.Align := alClient;
                          memo.ReadOnly:=False;
                          memo.ScrollBars:=ssBoth;
                          memo.WordWrap:=false;
                          memo.Parent := zakladka;
                          //tworzenie TEdif
                          edit:=TEdit.Create(Self);
                          edit.Align:=alBottom;
                          edit.ReadOnly:=True;
                          edit.Parent:=zakladka;

                          inc(n);
                          m:=0;
               end;
       inc(m);
  end;

  PageControl1.Pages[0].Show;  //pierwsza zakladka aktywna
end;

end.
1

możesz na przykład w dynamicznie stworzonym memo w Tag, zapisać nr pierwszej linii z oryginalnego memo lub po prostu numer tego memo, wtedy będziesz wiedział którą linię w oryginalnym memo zeedytować. tylko pamiętaj, żeby uwzględnić fakt, że jak w dynamicznym memo dodasz linię, to musisz zaktualizować tagi pozostałych memo.

0

Wielkie dzięki za odpowiedź tylko nie za bardzo wiem jak to zrobić ;/ Możesz trochę bardziej łopatologicznie?

1

Najprościej - ale pewnie mało elegancko - po zmianie liczby w którymkolwiek "dynamicznym" memo, przepisać zawartości wszystkich "dynamicznych" memo do memo1:)

0

To jest dobry pomysł tylko że przy kilkuset dynamicznych memo będzie to dosyć wolne ;/

0

przy kilku set dynamicznie stworzonych memo albo ci zabraknie RAMu albo w ogóle ci komp nie obrobi komp ;]

0

Jak napisać żeby przepisywało mi wartości z dynamicznych memo do memo1? Próbuje to napisać ale mi nie wychodzi.
Program ma tak działać, nie ja go wymyśliłem :) Nie będzie on do niczego używany, jest to tylko zaliczenie z przedmiotu.

Próbuje to jakoś zrobić i nie wiem jak napisać procedure która skopiuje mi po zmianie w dynamicznym memo właśnie z niego do memo1

0

Nie umiem sprawdzić, czy w dynamicznym memo zaszły jakieś zmiany. Pomoże ktoś?

1

piszesz sobie procedure:

var
  memos: array of TMemo;
procedure TForm1.MemoChange(Sender: TObject);
begin
  //tutaj twoja procedura, aktualne memo możesz uzyskać poprzez:
  // var aktualnememo:TMemo
  // atualnememo := Sender as TMemo;
end;

memos, to jest lista Tych memo co stworzyłeś, pewnie masz coś takiego w kodzie

i po prostu do każdego memo przypisujesz:
DynamiczneMemo.OnChange :=MemoChange;

0

Nie moge sobie z tym poradzić. U mnie nowe memo tworzy się w nowej zakładce TTabSheet i nie wiem jak z tego dostać się do memo.

1

FindComponent + Google lub F1.

0

Na każdej zakładce mam jedno memo więc chyba nie musze używać FindComponent? Przy dodawaniu tekstu odwołuje się do aktualnego memo poprzez:

 (PageControl1.ActivePage.Controls[0] as TMemo).Lines.Add

I chcę żeby zmiany sprawdzane były właśnie na aktywnej zakładce i jeśli jakieś są to żeby zmiany zrobiło również w głównym memo1. Tak chyba będzie najszybciej tylko że nie wiem jak to napisać ;/

0

do memo jak tworzysz dodaj event

memo.OnStatusChange:=EventOnStatusChange;

do sekcji public dopisz

procedure EventStatusChange(Sender: TObject; Changes: TSynStatusChanges);

i taka procedura

procedure TForm1.EventStatusChange(Sender: TObject; Changes: TSynStatusChanges);
begin
 if Sender is TSynMemo then
 begin
   ShowMessage((Sender as TSynMemo).Lines[1]); // to pokaże tekst z pierwej linii w tym dynamicznym memo
 end;
end;

Zakładając że korzystasz z paczki SynEdit (komponent TSynMemo) bo coś w uses widziałem, to kawałek z mojego programu ;]

--
I mam kilka zastrzeżeń do kodu programu a dokładnie co do użytych zmiennych i tablic
1.Jak już tworzysz z tablicami to musisz je dynamicznie powiększać bo co jak linii będzie 400 a co druga będzie pusta?
zabraknie index'ów w tablicy ...
2. po co ci tyle zmiennych m,n,i,l,liczby,licznik:integer; wystarczy 2 może 3 max i w ten sposub będziesz miał mniej kodu a ten sam szybciej wykonywający się kod...
3. i weź twórz te TTabSheet i TMemo podczas ładowania pliku

0

Wywala mi błąd przy

memo.OnStatusChange:=EventOnStatusChange;

w trakcie tworzenia nowego memo

0

masz komponenty SynMemo to jak masz

var
 memo: TMemo;

to daj

 memo: TSynMemo;
0

Error: Identifier not found "TSynMemo"

Nie wiem czy jest to istotne ale pisze ten program w Lazarusie w Pascalu

0

Musze to zrobić na standardowych komponentach bo jak już wcześniej pisałem program jest na zaliczenie i nauczyciel stawia warunki co i jak ma być zrobione;/

0

Rozwiązałem to w całkiem inny sposób ale kierując się waszymi podpowiedziami. Wielkie dzięki za pomoc :)

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