[Delphi] Вопрос на засыпку #5

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RedFern.89, 1 Sep 2010.

  1. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    Всем доброго времени суток уважаемые программисты! На сегодня возник такой вопрос: есть скажем TStringList, нужно отследить и вывести, тот пункт, который удалили/добавили. Как сие сделать? Если кто сможет - напишите пример. Буду очень признателен! [​IMG]
     
  2. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    OnChange, OnChanging, не? Так же можешь сделать производный класс от TStringList и переопределить нужные методы.
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 RedFern.89 ты случаем не перепилли? стринг лист это не визуальный компонент. И то что ты туда добавляешь и удаляешь - ты сам это делаешь. Или ты собрался следить за самим собой?
    Исключение если там данные изменяются какимто компонентом, то тогда да. Лучше сделать наследник от него который будет иметь нужные действия.
     
    1 person likes this.
  4. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Ему наверно надо отслеживать изменения в дереве.
    RedFern.89, если я прав то советую заново спроектировать архитектуру приложения, ибо проблем огребете еще не раз.
     
    1 person likes this.
  5. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    все дело вот в чем. TStringList меняется раз в секунду. Там идет список дисков< который обновляется скажем раз в секунду. Мне надо проследить какие диски ушли/добавились.
     
  6. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    дык в чем вопрос то лочим список смотрим анлочим примерно так
    Code:
    hardware_list_lock();
    lookup(); 
    hardware_list_unlock();
    
    или трудности с просмотром ?
    или там где происходит изменение добавление удаление там и запоминай изменения куда нить а потом в том месте где они нужны смотри из ранее сохраненного места
    можно по месту смотреть но это крайне неэффективно типа
    Code:
     
    hardware_list_lock();
    lookup_diff(); смотрит отличия в списках
    dup_list(primary_list, slave_list);  делает копию 
    hardware_list_unlock();
    
    но это неэффективно очень если есть возможность сохранять лучше там где эти изменения происходят
     
    #6 greki_hoy, 1 Sep 2010
    Last edited: 1 Sep 2010
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    К сожалению события OnChange и OnChanging у TStringList имеют тип TNotifyEvent, по-этому ничего кроме Sender обрабатывая их не получишь.
    По-этому наследуешь от него, переопределяешь методы Add, Delete, Insert etc, (благо они все виртуальные) в них вызываешь родительские методы и вызываешь свое событие передавая в него нужные данные, например строку которая была добавлена
    например:
    PHP:
    type
    TMyAddEvent 
    procedure (const sstringof object;
    TMyStringList = class(TStringList)
    private
    FOnAddTMyAddEvent;
    public
    property OnAddTMyAddEventread FOnAd write FOnAd;
    function 
    Add(const sstring): Integeroverride;
    ........................
    end;
    ...............................
    function 
    TMyStringList.Add(const sstring): Integer;
    begin
     Result 
    := inherited (s);
      if 
    Assigned(FonAddthen 
      FOnAdd
    (s);
    end;
    Ну а уже обрабатывая событие извне будешь знать какая строка была добавлена
    Главное не внедрять логику конкретного приложения в этот класс, чтобы его можно было повторно использовать в дальнейшем.