Использую WebBrowser. Задача получить данные передаваемых Post запросом. Пробую в событии OnBeforeNavigate2 прописать Code: mmo1.Lines.Add(PostData); Данные приходят но одни вопросы и плюсы. Как сделать чтобы в нормальном виде приходило типа (send=3&acc=ddd)?
Задачка в школе.. 9кл : Помогите решить ) уже второй час хней страдаю... на тему переменных и самой сути задачи сам не понял (переписано как было на листе с заданием).. может кто-то сталкивался с подобным? Язык любой, желательно Паскалевй / СИшный ..
подскажите пожалуйста как применить настройки реестра в win7? изменил 1 ключ, но изменения появляются лишь после перезагрузки системы. есть ли спец команда, которая заставит винду прочитать новые параметры? delphi
Пытаюсь в разделе 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 в случае, когда требуется объявить несколько классов, которые должны иметь взаимные указатели на типы друг друга?
raven1992 Code: type [B]myclass2 = class;[/B] myclass1 = class (Tobject) public linked_calss: ^myclass2; end; myclass2 = class (Tobject) public linked_calss: ^myclass1; end; хехе, а ты raven1992 я смотрю тоже ворон)
я это замечал, но не был уверен что это правильно. Да и непонятно, зачем вообще тогда в дельфи нужна конструкция ^тип Спасибо, ты ответил на вопрос, который меня тоже интересовал. Я и сам заметил, что разницы между записью "^тип" и "тип" на практике нет. Что касается предыдущего моего вопроса, то я сделал так: 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с-склад (ну или большинства уже существующих двигов БД) И, по идее, должно в чистом виде иметь только кнопки: "добавить\удалить\редактировать(подкатегорию, свойство, запись )". Хотя каждая графа - это по сути тоже подкатегория, так что логика работы и вовсе сводится к оперированию лишь полями и записями, таблицы же кэшируются и генерируются(отображаются) на лету, "на самом деле" никаких таблиц ... нет интиресно? Спрашиваю именно у теюя, потому что такой глобальный и непонятно-зачем-нужный замут может увлечь разве что ч-ка, вполтную занимающегося самосовершенствованием.
^тип нужен для того чтобы создать указатель на запись например, и выделять память динамически в куче, а не на стеке. а почему ты юзаешь пойнтеры все-таки? чем тебе не угодило предварительное объявление класса из моего ответа?
Есть некоторая разница при работе с объектами и переменными типа запись (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; Здесь нужно хорошо подумать над архитектурой перед началом реализации. При неограниченной вложенности разных параметров могут быть трудности с представлением всех этих данных в памяти. Можно обойтись множеством полей, которые характеризуют что то (в твоем примере животных). Произвольное количество таблиц и полей можно попробовать сделать. Но не уверен. Достаточно грамотно организовать связи между полями и таблицами.
Code: var S: string; begin Label1.Caption := IntToStr(Memo1.Lines.Count); s := Label1.Caption; StringGrid1.RowCount:=StringGrid1.RowCount + s; Как мне кажется ошибка в кодировке , т.к когда я меняю кодировку на string не работает ,а работает только в integer. Подскажи код как правильно сделать .
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; А также это не кодировка, а тип переменных.
Белый Ворон я не заметил у тебя поначалу "предварительного объявления", показалось ты просто заквотил ( Спасибо, это именно то что я искал Chrome~ За эти пару дней и сам столкнулся с тем, что ^тип это "указатель на указатель", убрал их все. В сейчас уберу и поинтеры везде, где заранее знаю типы, благодаря вам с Белым Вороном. Про рекорды и удобное обращение к ним через ^ просветил. Насчёт памяти (по БД с животными) - ессна её не хватит. базу на несколько гигов в ОЗУ (единовременно), хоть тресни, не разместить. Но важнее, как ты заметил, - правильно организовать логическую связь между всеми элементаим, чтобы добиться макс. скорости "сёрфинга" по БД (где бы она не располагалась)
Вопрос, касающийся удобства. Как написать функцию, которая бы добавляла новый элемент в массив любого типа? Т.е. можно ли заменить строки Code: len:=length(массив); setlength(массив,len+1); какой-то своей ф-цией Code: add_new_array_element(массив) так, чтобы она подходила для массивов любых типов? Мелочь, но некрасиво когда в коде 50 раз повторяются одни и те же две строки, да ещё и половина функций имеет переменную len. Если тип массива заранее известен, то проблемы нет. Так же можно вручную написать overloaded функции для каждого типа массивов, что есть в программе. А "красивее", чем писать десять overloaded ф-ций, или много раз дублировать одно и то же, можно?
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() потеряет актуальность.
Использую 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; Код выполняется нормально, но в итоге окошко всеравно закрывается, а мне нужно, чтобы не закрывалось. Что посоветуете?
Посоветую доку читать больше 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;