Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    whitewolfs

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt вообще хотелось бы мышкой, там по правой клавише контекстное меню должно вылазить, а в нём уже нужный пункт. Про интер думал уже, можно будет и так, только до нужного пункта придется дольше добираться, через промежуточные окна.
     
    Индекс выделенной строки получаю, но по нему не определишь координаты...
     
    И ещё дополнительный вопрос:
    как выделить нужную строку я знаю, а вот как снять выделение с нужной или со всех сразу строк чужого ListView?
     
     

    Всего записей: 300 | Зарегистр. 21-10-2005 | Отправлено: 08:26 21-07-2009
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    whitewolfs

    Цитата:
    Индекс выделенной строки получаю, но по нему не определишь координаты...  

    На самом деле определишь. GetWindowRect с хэндлом ЛистВью вернет тебе координаты (Left, Top) листа относительно верхнего левого угла экрана. Далее при помощи LVM_GETITEMRECT получаешь координаты выделенного пункта (так как индекс его ты получить можешь). А далее плюсуешь левую позицию листа и левую позицию пункта, аналогично для Тора. Прибавляешь по 1 туда и сюда и получаешь координаты куда надо поместить мышь, чтобы она оказалась над пунктом.
    Вообще то вопрос для ВинАПИ
    Вот код который помещает курсор над пунктом с индексом Index
    var
         WRect,Itm:TRect;
    begin
         GetWindowRect(ListView1.Handle,Wrect);
         if ListView_GetItemRect(ListView1.Handle,Index,Itm,LVIR_SELECTBOUNDS) then
         SetCursorPos(Itm.Left+Wrect.Left+5, Itm.Top+Wrect.Top+5);


    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:43 21-07-2009 | Исправлено: ShIvADeSt, 08:53 21-07-2009
    whitewolfs

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt спасибо! завтра попробую.

    Всего записей: 300 | Зарегистр. 21-10-2005 | Отправлено: 10:58 21-07-2009
    spasius



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JohnSilver182
    MrZeRo
    при чем здесь что что лучше, что хуже. существует серваг который собирает почту через SMTP. Далее нужно ее просто переслать. И тут гвоздь. Почта разношерстная, идет по разным адресам, пароли пользователей на других серверах не известны. Вопрос в том, как потом ее переслать до конечной точки ...?

    Всего записей: 695 | Зарегистр. 16-03-2009 | Отправлено: 13:14 21-07-2009
    urmigar



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    spasius
     
    Если я правильно понял, то тебе нужно отправить письмо, скажем, на мыло username@mailserver.com, не имея никакого логина и пароля? Так сказать smtp сервером поработать?
     
    Сталкивался с такой проблемой, решение есть в пакете компонентов madCollection - даже с примером реализации.
     
    Единственно, у меня возникали проблемы отправки на некоторые майл-сервисы писем, так что если кто знает чем помочь - сообщите, пожалуйста. Даже если я неправильно понял что имеет ввиду spasius, то вышеописанный вопрос интересует лично меня

    Всего записей: 437 | Зарегистр. 18-01-2008 | Отправлено: 13:26 21-07-2009
    spasius



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    urmigar
    да вопрос понят правильно ... спасибо буду пробовать ...

    Всего записей: 695 | Зарегистр. 16-03-2009 | Отправлено: 14:10 21-07-2009
    Kursist



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, забыл как это делать.
    Создаю список объектов. Нужен доступ к свойствам объектов, чтобы можно было бы их редактировать. Как-то делал, но не могу найти прежний код.
    Вот код, который позволяет читать, но не позволяет редактировать - присваивать значение:
     

    Цитата:
     
    TapSite=Record
      Empty:Boolean;
      BuildingID:Integer;
    End;  
     
     TSite=class
      Info: TapSite;
     end;
     
      TListSite=class
        private
        FItem:TList;
        FCount:Integer;
        public
        constructor Create;
        function AddSite:Integer;
        function Delete(ID:Integer):Boolean;
        function Items(ID:Integer):TapSite;
        procedure Clear;
        property Count:Integer read FCount;
      end;
     
     
    { TListSite }
    //--------------------------SITE LIST ADD------------------------------------------------------
    function TListSite.AddSite: Integer;
    begin
     self.FItem.Add(TSite.Create);
     FCount:=FItem.Count;
     Result:= FItem.Count-1;
    end;
    //--------------------------SITE LIST CLEAR------------------------------------------------------
    procedure TListSite.Clear;
    begin
     FItem.Clear;
     FCount:=FItem.Count;
    end;
    //--------------------------SITE LIST CREATE------------------------------------------------------
    constructor TListSite.Create;
    begin
     inherited;
     FItem:=TList.Create;
     FCount:=FItem.Count;
    end;
    //--------------------------SITE LIST DELETE------------------------------------------------------
    function TListSite.Delete(ID: Integer): Boolean;
    begin
     Result:=FALSE;
     if (FItem.Count=0) or (ID>FItem.Count) then exit
      else  FItem.Delete(ID);
     FCount:=FItem.Count;
     Result:=TRUE;
    end;
    //--------------------------SITE LIST ITEMS------------------------------------------------------
    function TListSite.Items(ID: Integer): TapSite;
    begin
      if (ID>0) and (ID<FItem.Count) then
       Result:=TSite(FItem.Items[ID]).Info;
    end;
     
     

     
    Нужна такая реализация:
    SitesList.Items(loop).Empty:=TRUE; //запись какого-то свойства объекта в списке

    Всего записей: 137 | Зарегистр. 12-07-2004 | Отправлено: 15:17 22-07-2009 | Исправлено: Kursist, 16:51 22-07-2009
    volser

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kursist
    Так а что не работает?

    Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 17:03 22-07-2009
    Kursist



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    volser
     
       for loop := 0 to Count-1 do
        begin
        SitesList.AddSite;
        SitesList.Items(loop).Empty:=TRUE;
        SitesList.Items(loop).BuildingID:=-1;
        end;
     

    Цитата:
     
    [DCC Error] main31.pas(71): E2064 Left side cannot be assigned to
    [DCC Error] main31.pas(72): E2064 Left side cannot be assigned to

     
    (После больницы голова туго варит. Не могу вспомнить, как я это делал. Хочется спрятать приведение типов).
     
    Не составит труда написать процедуру SetItem(ID:Integer, SiteInfo:TapSite); Но это как бы "тяжелая артилерия" - то есть, присваивать придется все элементы записи, а не по отдельности.
     
    Хочется доступа к отдельным элементам записи (Record-a)
     
    Добавлено:
    Так заработало:
     
      TListSite=class
        private
        FItem:TList;
        FCount:Integer;
        public
        constructor Create;
        function AddSite:Integer;
        function Delete(ID:Integer):Boolean;
        //function Items(ID:Integer):TapSite;
        function Items(ID:Integer):TSite;
        procedure Clear;
        property Count:Integer read FCount;
      end;
     
    function TListSite.Items(ID: Integer): TSite;
    begin
      if (ID>0) and (ID<FItem.Count) then
       Result:=TSite(FItem.Items[ID]);
    end;
     
    только использование класса выглядит так:
       for loop := 0 to Count-1 do
        begin
        SitesList.AddSite;
        SitesList.Items(loop).Info.Empty:=TRUE;
        SitesList.Items(loop).Info.BuildingID:=-1;
        end;

    Всего записей: 137 | Зарегистр. 12-07-2004 | Отправлено: 17:11 22-07-2009 | Исправлено: Kursist, 17:30 22-07-2009
    SIgor33

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Такой вопрос. Кто нибудь делал конвертацию из word 2007 в richview. Если есть пример киньте

    Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 17:40 22-07-2009
    Kursist



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не понимаю, почему код не работал в первом случае!

    Всего записей: 137 | Зарегистр. 12-07-2004 | Отправлено: 17:41 22-07-2009
    Ramazan



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kursist
    А как насчет:

    Код:
     
    TapSite = class(TCollectionItem)
    private
      FEmpty: Boolean;
      FBuildingID:Integer;
    public
      property Empty: Boolean read FEmpty write FEmpty;
      property BuildingID: Integer read FFBuildingID write FFBuildingID;
    end;
     
    TListSite=class(TCollection)
    private
      function GetItem(Id: Integer): TapSite;
      procedure SetItem(Id: Integer; Value: TapSite);
    public
      function Add: TapSite;
      property Items[Id: Integer]: TapSite read GetItem write SetItem; default;
    end;
     

     
    Кстати, в твоем коде и деструктор отсутствует.
     
    PS: Не работало присваивание результата вызову функции.

    ----------
    Per rectum ad...

    Всего записей: 359 | Зарегистр. 13-04-2002 | Отправлено: 20:21 22-07-2009 | Исправлено: Ramazan, 20:27 22-07-2009
    Kursist



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ramazan
    Спасибо, ты привел очень хороший код.
    И я так тоже делал, так как он позволяет контролировать введенные значения (более безопасный), но для очень простого класса мне не хотелось заморачиваться парами методов Get/Set.
    (Можно считать, что я искал, точнее, вспоминал, альтернативный (менее безопасный) метод.

    Всего записей: 137 | Зарегистр. 12-07-2004 | Отправлено: 20:53 22-07-2009
    Ramazan



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kursist

    Цитата:
    альтернативный (менее безопасный) метод

    Ну, если не ставилась задача написания собственной реализации списка, то можно вспомнить и обычные динамические массивы.

    ----------
    Per rectum ad...

    Всего записей: 359 | Зарегистр. 13-04-2002 | Отправлено: 21:00 22-07-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kursist
    Если делать с минимальными модификациями первоначального варианта, то наверно надо передавать ссылки на рекорды, а не сами рекорды.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:43 23-07-2009
    spasius



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kursist
    используй не записи а класс, пускай даже не CollectionItem, и свойства выведи через Property (read & write).

    Всего записей: 695 | Зарегистр. 16-03-2009 | Отправлено: 21:45 23-07-2009
    Kursist



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    spasius
     
    Спасибо!
    Сделал так:
     
    PSite=^TapSite;
     
    function TListSite.Items(ID: Integer): PSite;
    begin
      if (ID>0) and (ID<FItem.Count) then
      Result:=@TSite(FItem.Items[ID]).Info;
    end;
     
    Тогда использование кода так как хотелось:
     
    SitesList.Items(loop).Empty:=TRUE;
    SitesList.Items(loop).BuildingID:=-1;
     
    Данной реализации мне достаточно, так как мне не нужно было использование методов в классе.

    Всего записей: 137 | Зарегистр. 12-07-2004 | Отправлено: 23:30 23-07-2009
    rdenk1

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые программисты!
    Есть dblookuplistbox, в нем отображаются значения поля таблицы БД (формат MS Access). Хотелось бы добавить возможность удаления из БД той записи, которая выделена в dblookuplistbox. Допустим, выделил запись (прямо в dblookuplistbox), нажал del на клавиатуре, соответствующая запись удалилась из базы (ну и из самого dblookuplistbox тоже, естественно). Как сделать такое?
     
    Добавлено:
    И еще хотелось бы убрать надоедающее сообщение database login при запуске программы. Используется Microsoft.Jet.OLEDB.4.0. Логин и пароль пустые и скорее всего так и будут пустыми, это не настолько секретная БД. А заставлять пользователей нажимать каждый раз это окно не хочется.

    Всего записей: 117 | Зарегистр. 27-04-2009 | Отправлено: 07:28 26-07-2009
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    rdenk1

    Цитата:
    И еще хотелось бы убрать надоедающее сообщение database login при запуске программы

    LoginPrompt = False спасет тебя

    Цитата:
    Есть dblookuplistbox, в нем отображаются значения поля таблицы БД (формат MS Access).

    у тебя лукап прикручен по идее к Table или Query. Вот при нажатии на кнопку удалить делай примерно так
    MyQuery.Delete;
    ну и после этого переоткрыть таблицу возможно понадобится.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:45 26-07-2009
    rdenk1

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хорошо, а если таким же макаром нужно еще и добавить запись в таблицу (редактируестся запись в простом edit'е, таблица игрушечная и состоит всего из одного поля), то нужно ли для этого добавлять компонент query? А то у меня сейчас на форме только компоненты: ADOConnection, ADOTable, DataSource, DBLookupListBox. Или можно силами только этих компонентов внедрить запись?

    Всего записей: 117 | Зарегистр. 27-04-2009 | Отправлено: 08:58 26-07-2009
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru