[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Я просто предложил вариант.
    А что выберать это уже вопрос не мой...
     
  2. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Использую WebBrowser. Задача получить данные передаваемых Post запросом.
    Пробую в событии OnBeforeNavigate2 прописать
    Code:
     mmo1.Lines.Add(PostData);
    Данные приходят но одни вопросы и плюсы. Как сделать чтобы в нормальном виде приходило типа (send=3&acc=ddd)?
     
  3. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    URLDecode не спасает?
     
  4. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    Кодировка?
    пробуй ansitoutf8() или utf8toansi()
     
  5. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    Задачка в школе.. 9кл :

    Помогите решить ) уже второй час хней страдаю... на тему переменных и самой сути задачи сам не понял (переписано как было на листе с заданием).. может кто-то сталкивался с подобным?

    Язык любой, желательно Паскалевй / СИшный ..
     
  6. AtomoS

    AtomoS New Member

    Joined:
    17 Feb 2010
    Messages:
    88
    Likes Received:
    1
    Reputations:
    0
    подскажите пожалуйста как применить настройки реестра в win7?

    изменил 1 ключ, но изменения появляются лишь после перезагрузки системы.
    есть ли спец команда, которая заставит винду прочитать новые параметры?

    delphi
     
  7. raven1992

    raven1992 New Member

    Joined:
    6 Oct 2011
    Messages:
    56
    Likes Received:
    3
    Reputations:
    0
    Пытаюсь в разделе type объявить два типа:

    Code:
    type
       myclass1 = class (Tobject)
          public
             linked_calss: ^myclass2;
          end;
    
    type
       myclass2 = class (Tobject)
          public
             linked_calss: ^myclass1;
          end;
    компилятор Delphi 6 пишет ошибку "не объявлен идентификатор myclass2".

    как это сделать, не присваивая полям linked_calss тип pointer?
    Т.е. можно как-то грамотно избежать использования необъявленных pointer в случае, когда требуется объявить несколько классов, которые должны иметь взаимные указатели на типы друг друга?
     
    #9327 raven1992, 15 Nov 2012
    Last edited: 15 Nov 2012
  8. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    raven1992
    Code:
    type
       [B]myclass2 = class;[/B]
    
       myclass1 = class (Tobject)
          public
             linked_calss: ^myclass2;
          end;
    
       myclass2 = class (Tobject)
          public
             linked_calss: ^myclass1;
          end;
    
    хехе, а ты raven1992 я смотрю тоже ворон)
     
    #9328 Белый Ворон, 15 Nov 2012
    Last edited: 15 Nov 2012
  9. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Не пиши так, потому что в Delphi объект и есть указателем.
     
  10. raven1992

    raven1992 New Member

    Joined:
    6 Oct 2011
    Messages:
    56
    Likes Received:
    3
    Reputations:
    0
    я это замечал, но не был уверен что это правильно.
    Да и непонятно, зачем вообще тогда в дельфи нужна конструкция ^тип :)

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

    Что касается предыдущего моего вопроса, то я сделал так:
    Code:
    type
       myclass1 = class (Tobject)
          public
            linked_calss: pointer; 
            function test_func(link:pointer):integer;
          end;
    
    type
       myclass2 = class (Tobject)
          public
             test_field:string;
             linked_calss: pointer;
          end;
    
    function myclass1.test_func(link:pointer);
    var
       linked_class:^myclass2;
    begin
        linked_class:=link;
      linked_class.test_field:='data_for_2_class';
    end;
    
    ещё можно было так:
    Code:
    function myclass1.test_func(link:pointer);
    begin
        Tmyclass2(link).test_field:='data_for_2_class';
    end;
    
    но в случае, когда нужно обратиться к чему-нибудь типа
    link.child_link.sublink.sublink_field.sublink_data:='123'
    то запись методом
    Tmyclass2_child(Tmyclass2(link).child_link).sublnk ... итд
    превращается в полный маразм.

    Хотя все равно не логично, что нельзя объявить список имён будущих типов перед тем, как задавать этим типам значения.

    ps. рад что ты, ~Chrome, все ещё бываешь тут.:) Боюсь представить твой текущий объем знаний;)

    Как тебе:
    БД с произвольным количеством категорий(таблиц), каждая из к-рых может иметь свои поля а так же подтаблицы(связанные таблицы, к-рые наследуют поля родительских+ могут иметь свои). Подтаблицы могут иметь свои подтаблицы, итд. Вложенность не ограничена.
    Так же категория(таблица) любого уровня может иметь записи, которые видны не только в данной таблице, но и во всех родительских таблицах (поля, которые есть у записи, но к-рых нет в текущей родительской таблице в ней не отображаются).
    Структура дерева таблиц заранее не задана и может масштабироваться (углубляться) неограниченно, причём изменяться она может непосредственно во время работы.
    Объём памяти, который тратится на одну запись не должен зависеть от количества таблиц, в которую эта запись транслируется.
    На всех этапах инфа кэшируется, для возможности быстрого отображения любой подтаблицы, показывающей (если это потребовалось) все элементы всех её подтаблиц.
    (чем-то похожа на тотал-комендер "отображать все файлы всех подпапок", только инфа должна кэшироваться, и если изменений не было - выводиться из кэша, а если были - должен изменяться только тот кэш, к-рого эти изменения коснулись).

    В конечном итоге БД должна суметь вместить всех существующих животных и отображать их в соотсетствии с их классификацией, начиная от "прокариоты, эукариоты, итд" и заканчивая "кличка, персоональные особенности конкретного экземпляра особи".
    С животными - это скорее просто пример.

    Логика поиска:
    ->животные
    (всем животным присуще свойство - теплокровные или нет, значит это одна из граф таблы животные)
    ->теплокровные
    (из таблы животные убраны все не-теплокроаные, и в названии таблы теперь написано >животные>теплокровные)
    дальше
    ->тип дыхания:аэробное
    (тип дыхания - тоже свойство всех животных, нажав на эту графу и выбрав "оставить аэробное" получаем таблицу с заголовком)
    ->животные->теплокровные->тип дыхания:аэробное
    Ну и так далее, пока не доберемся(произвольным способом) до нашей собственной кошки или собаки с кличкой "шарик"\"пушистик".

    А ещё это всё должно отображать инфу быстрее, чем если бы учёт вёлся с помошью 1с-склад (ну или большинства уже существующих двигов БД) ;) :D
    И, по идее, должно в чистом виде иметь только кнопки:
    "добавить\удалить\редактировать(подкатегорию, свойство, запись )". Хотя каждая графа - это по сути тоже подкатегория, так что логика работы и вовсе сводится к оперированию лишь полями и записями, таблицы же кэшируются и генерируются(отображаются) на лету, "на самом деле" никаких таблиц ... нет ;)

    интиресно?:)
    Спрашиваю именно у теюя, потому что такой глобальный и непонятно-зачем-нужный замут может увлечь разве что ч-ка, вполтную занимающегося самосовершенствованием.
     
    #9330 raven1992, 16 Nov 2012
    Last edited: 16 Nov 2012
  11. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    ^тип нужен для того чтобы создать указатель на запись например, и выделять память динамически в куче, а не на стеке.

    а почему ты юзаешь пойнтеры все-таки?
    чем тебе не угодило предварительное объявление класса из моего ответа?
     
    #9331 Белый Ворон, 16 Nov 2012
    Last edited: 16 Nov 2012
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Есть некоторая разница при работе с объектами и переменными типа запись (record).
    Объект - это и есть ссылка, поэтому не нужно писать что то в стиле
    Code:
    var
      obj: ^TObject;
    Достаточно записывать
    Code:
    var
      obj: TObject;
    Здесь obj можно легко привести к типу Pointer.
    Code:
    p := Pointer(obj);
    С записями все немного по другому и есть смысл использования символа ^.
    Code:
    TTestRecord = record
      a: Integer;
      b: Integer;
    end;
    PTestRecord = ^TTestRecord;
    Переменная типа TTestRecord являет собой запись, а не указатель на нее. Указатель на саму запись можно получить, например, так:
    Code:
    var
      rec: TTestRecord;
      p: Pointer;
    begin
      p := @rec;
    end;
    Лучше избавиться от Pointer'ов в классе.
    Code:
    type
      TClass2 = class;
      
      TClass1 = class
        ...
        Obj: TClass2;
        ...
      end;
      
      TClass2 = class
        ...
        Obj: TClass1;
        ...
      end;
    Здесь нужно хорошо подумать над архитектурой перед началом реализации. При неограниченной вложенности разных параметров могут быть трудности с представлением всех этих данных в памяти. Можно обойтись множеством полей, которые характеризуют что то (в твоем примере животных). Произвольное количество таблиц и полей можно попробовать сделать. Но
    не уверен. Достаточно грамотно организовать связи между полями и таблицами.
     
  13. by_nikita

    by_nikita Member

    Joined:
    1 Dec 2010
    Messages:
    46
    Likes Received:
    11
    Reputations:
    5
    Code:
    var
    S: string;
    begin
    Label1.Caption := IntToStr(Memo1.Lines.Count);
    s := Label1.Caption;
    StringGrid1.RowCount:=StringGrid1.RowCount + s;
    
    Как мне кажется ошибка в кодировке , т.к когда я меняю кодировку на string не работает ,а работает только в integer. Подскажи код как правильно сделать .
     
  14. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Code:
    var
    S: string;
    begin
    Label1.Caption := IntToStr(Memo1.Lines.Count);
    s := Label1.Caption;
    StringGrid1.RowCount:=StringGrid1.RowCount + strtoint(s);
    
    либо сразу:

    Code:
    StringGrid1.RowCount:=StringGrid1.RowCount + Memo1.Lines.Count;
    
    А также это не кодировка, а тип переменных.
     
  15. raven1992

    raven1992 New Member

    Joined:
    6 Oct 2011
    Messages:
    56
    Likes Received:
    3
    Reputations:
    0
    Белый Ворон

    я не заметил у тебя поначалу "предварительного объявления", показалось ты просто заквотил :((
    Спасибо, это именно то что я искал :)

    Chrome~
    За эти пару дней и сам столкнулся с тем, что ^тип это "указатель на указатель", убрал их все. В сейчас уберу и поинтеры везде, где заранее знаю типы, благодаря вам с Белым Вороном.
    Про рекорды и удобное обращение к ним через ^ просветил.

    Насчёт памяти (по БД с животными) - ессна её не хватит. базу на несколько гигов в ОЗУ (единовременно), хоть тресни, не разместить. Но важнее, как ты заметил, - правильно организовать логическую связь между всеми элементаим, чтобы добиться макс. скорости "сёрфинга" по БД (где бы она не располагалась)
     
    #9335 raven1992, 19 Nov 2012
    Last edited: 19 Nov 2012
  16. raven1992

    raven1992 New Member

    Joined:
    6 Oct 2011
    Messages:
    56
    Likes Received:
    3
    Reputations:
    0
    Вопрос, касающийся удобства.

    Как написать функцию, которая бы добавляла новый элемент в массив любого типа?

    Т.е. можно ли заменить строки
    Code:
       len:=length(массив);
       setlength(массив,len+1);
    какой-то своей ф-цией
    Code:
    add_new_array_element(массив)
    так, чтобы она подходила для массивов любых типов?
    Мелочь, но некрасиво когда в коде 50 раз повторяются одни и те же две строки, да ещё и половина функций имеет переменную len.

    Если тип массива заранее известен, то проблемы нет. Так же можно вручную написать overloaded функции для каждого типа массивов, что есть в программе.
    А "красивее", чем писать десять overloaded ф-ций, или много раз дублировать одно и то же, можно?
     
    #9336 raven1992, 19 Nov 2012
    Last edited: 19 Nov 2012
  17. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    raven1992
    я давно не прогаю на дельфи, и многое мог подзабыть, да и компилятора нет, проверить не могу ничего, но нельзя ли попробовать поюзать нетипизированные параметры?
    http://codingrus.ru/readarticle.php?article_id=2492

    типа такого
    procedure AddNewItem(var item)

    а вообще, лучше уж переходи на версии Delphi 2009+
    там есть типизированные обобщенные коллекции для любых типов
    а код навроде
    Code:
    len:=length(массив);
       setlength(массив,len+1);
    - зло, ибо на каждое добавление элемента ты вызываешь SetLength. если надо будет добавлять много элементов тормозить будет жутко.
    можно в принципе оптимизировать это дело, вызывая SetLength например для каждого 10-го или 100-го элемента (то есть выделяя память для массива блоками), но тогда тебе придется сохранять в отдельную переменную индекс последнего добавленного элемента, ибо Length() потеряет актуальность.
     
  18. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    raven1992, TList юзать не вариант?
     
  19. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Использую Winapi. Перехватываю сообщение закрытия окна:
    Code:
    function MainWndProc(Window: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall;
    begin
       if AMessage = $0010
        then
           begin
            ...
           end;
          Result := DefWindowProc(Window, AMessage, WParam, LParam);
    end;
    Код выполняется нормально, но в итоге окошко всеравно закрывается, а мне нужно, чтобы не закрывалось. Что посоветуете?
     
  20. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Посоветую доку читать больше
    Code:
    function WindowProc(hWind: HWnd; AMessage, WParam, LParam: Longint): longint; stdcall;
    begin
      case AMessage of
        WM_CLOSE:
          begin
            case MessageBoxA(hWind, 'Закрыть программу?', '', MB_YESNO or MB_ICONQUESTION) of
              IDYES: DestroyWindow(hWind);
              else Result:= 0;
            end;
          end;
        WM_DESTROY:
          begin
            PostQuitMessage(0);
            Result:= 0;
          end;
        else Result:= DefWindowProc(hWind, AMessage, WParam, LParam);
      end;
    end;
     
Thread Status:
Not open for further replies.