Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: Образование, Работа и Бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Декабрь 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
|
Статистика
-1 за неделю
Выпуск No88.
Программирование на DELPHI
Рассылка сайта www.delphi.int.ru
Выпуск #88 (30 декабря 2009 г.)
Если Вы хотите где-либо разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с их автором или ведущим рассылки.
Delphi.int.ru Expert Последние новости
Архив: вопросы и ответы В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 1031 - 1050. Вопросы, на которые не было дано ни одного ответа, не публикуются. Статистика по выпуску:
Вопрос # 1 031 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Иусов Сергей Ник. Здравствуйте, natasha!
Вопрос # 1 032 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Вопрос # 1 033 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Вопрос # 1 034 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha!
Вопрос # 1 035 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: min@y™ {26. Написать функцию и процедуру, которая преобразует заданную строку, так, чтобы все прописные русские буквы стали строчными. Написать пример обращения к этой функции.} function RusUpperCase(const S: string): string; var i: Integer; begin Result:= S; for i:= 1 to Length(Result) do if Result[i] in ['А'..'Я'] then Result[i]:= Char(Byte(Result[i]) + 32) else if Result[i] = 'Ё' then Result[i]:= 'ё'; end; // Пример использования: S:= 'Пример ИсполЬзования'; WriteLn(RusUpperCase(S));
Вопрос # 1 036 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Вопрос # 1 037 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Вопрос # 1 038 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Николай Рубан Здравствуйте, natasha!
Вопрос # 1 039 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: min@y™ Делаем лабы вместе! УРА! {32. Написать функцию, которая работает так, как стандартная подпрограмма Insert, TrimLeft, TrimRight.} function MyInsert(const S, Sub: string, Index: Integer): string; begin Result:= Copy(S, 1, Index - 1) + Sub + Copy(S, Index, Length(S)); end; function MyTrimLeft(const S: string): string; begin Result:= S; while Result[1] in [#1..#32] do Delete(Result, 1, 1); end; function MyTrimRight(const S: string): string; begin Result:= S; while Result[Length(Result)] in [#1..#32] do Delete(Result, Length(Result), 1); end; Мадемуазель, читай книжки по паскалю. Хотя, наверное, это неплохой бизнес.
Вопрос # 1 041 Здравствуйте!
Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Трофимов Евгений! var i: Integer; begin Memo1.Clear; for i := 0 to Screen.Fonts.Count - 1 do Memo1.Lines.Add(Screen.Fonts[i]);Что бы получить характеристику шрифта, вам нужна структура TTextMetric. пример её использования можно подсмотреть здесь здесь В примере проверяют только TrueType шрифта, но полностю структуру можно подсмотреть в файле Windows и MSDN
Вопрос # 1 042 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, natasha! function Sum(const Data: array of Double): Extended register; сумма ряда function SumInt(const Data: array of Integer): Integer register; сумма ряда целых чисел
Вопрос # 1 043 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, natasha! function Mean(const Data: array of Double): Extended;
Вопрос # 1 044 Приветствую, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Бубырь Александр Николаевич Здравствуйте, natasha!
Ответ #2. Отвечает эксперт: Иусов Сергей Ник. Здравствуйте, natasha!
Ответ #3. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, natasha! Приложение:
Ответ #4. Отвечает эксперт: Feniks Здравствуйте, natasha!
Вопрос # 1 045 Здравствуйте!
Ответ #1. Отвечает эксперт: Feniks Здравствуйте, POWER! // Запуск консольного приложения и перехват вывода procedure ExecCmdine(const CmdLine: string; CmdResult: TStrings); var Output: PIOFile; Buffer: PChar; TempString: string; Line: string; BytesRead: Integer; const BufferSize: Integer = 1000; begin Output := popen(PChar(CmdLine), 'r'); GetMem(Buffer, BufferSize); if Assigned(Output) then try while feof(Output) = 0 do begin BytesRead := Libc.fread(Buffer, 1, BufferSize, Output); SetLength(TempString, Length(TempString)+BytesRead); memcpy(@TempString[length(TempString)-(BytesRead-1)], Buffer, BytesRead); while Pos(#10, TempString) > 0 do begin Line := Copy(TempString, 1, Pos(#10, TempString)-1); if CmdResult<>nil then CmdResult.Add(Line); TempString := copy(TempString, Pos(#10, TempString)+1, Length(TempString)); end; end; finally Libc.pclose(output); wait(nil); FreeMem(Buffer,BufferSize); end; end; Function Ping(host:string):boolean; var params, CommandLine:string; t:TStringList; i:integer; begin Params := Format('-s%d ', [32]); Params := Params+Format('-c%d ', [1]); CommandLine := Format('ping %s%s', [Params, host]); t:=TStringList.Create; ExecCmdine(CommandLine, t); Result:=pos('1 received, 0% packet loss', t.text)>0; t.free; end; Примечание - под отладчиком Kylix код может не работать. Надо запускать приложение не под Kylix для того чтобы удостовериться что код работает. Вариант 2. 1. Запускаем Delphi; 2. В Новом проекте добавляем в форму Tbutton, Tedit и Tmemo; 3. Вставляем "winsock"; 4. объявляем структурку для IP-заголовка: type IPINFO = record Ttl: char; Tos: char; IPFlags: char; OptSize: char; Options: ^char; end; 5. объявляем структурку для хранения ICMP пакета: type ICMPECHO = record Source: longint; Status: longint; RTTime: longint; DataSize: Shortint; Reserved: Shortint; pData: ^variant; i_ipinfo: IPINFO; end; 6. Объявляем функции и процедуры, которые мы будем вызывать из ICMP.DLL TIcmpCreateFile = function():integer; {$IFDEF WIN32} stdcall; {$ENDIF} TIcmpCloseHandle = procedure(var handle:integer);{$IFDEF WIN32} stdcall; {$ENDIF} TIcmpSendEcho = function(var handle:integer; endereco:DWORD; buffer:variant; tam:WORD; IP:IPINFO; ICMP:ICMPECHO; tamicmp:DWORD; tempo:DWORD):DWORD;{$IFDEF WIN32} stdcall; {$ENDIF} 7. В Tbutton в событие Onclick вставляем следующий код: procedure TForm1.Button1Click(Sender: TObject); var wsadt: wsadata; icmp: icmpecho; HNDicmp: integer; hndFile: integer; Host: PHostEnt; Destino: in_addr; Endereco: ^DWORD; IP: ipinfo; Retorno: integer; dwRetorno: DWORD; x: integer; IcmpCreateFile: TIcmpCreateFile; IcmpCloseHandle: TIcmpCloseHandle; IcmpSendEcho: TIcmpSendEcho; begin if (edit1.Text = '') then begin Application.MessageBox('Enter a HostName ro a IP Adress', 'Error', MB_OK); exit; end; HNDicmp := LoadLibrary('ICMP.DLL'); if (HNDicmp <> 0) then begin @IcmpCreateFile := GetProcAddress(HNDicmp, 'IcmpCreateFile'); @IcmpCloseHandle := GetProcAddress(HNDicmp, 'IcmpCloseHandle'); @IcmpSendEcho := GetProcAddress(HNDicmp, 'IcmpSendEcho'); if (@IcmpCreateFile = nil) or (@IcmpCloseHandle = nil) or (@IcmpSendEcho = nil) then begin Application.MessageBox('Error getting ICMP Adress', 'Error', MB_OK); FreeLibrary(HNDicmp); end; end; Retorno := WSAStartup($0101, wsadt); if (Retorno <> 0) then begin Application.MessageBox('Canґt Load WinSockets', 'WSAStartup', MB_OK); WSACleanup(); FreeLibrary(HNDicmp); end; Destino.S_addr := inet_addr(Pchar(Edit1.text)); if (Destino.S_addr = 0) then begin Host := GetHostbyName(PChar(Edit1.text)); end else begin Host := GetHostbyAddr(@Destino, sizeof(in_addr), AF_INET); end; if (host = nil) then begin Application.MessageBox('Host not found', 'Error', MB_OK); WSACleanup(); FreeLibrary(HNDicmp); exit; end; memo1.Lines.Add('Pinging ' + Edit1.text); Endereco := @Host.h_addr_list; HNDFile := IcmpCreateFile(); for x := 0 to 4 do begin Ip.Ttl := char(255); Ip.Tos := char(0); Ip.IPFlags := char(0); Ip.OptSize := char(0); Ip.Options := nil; dwRetorno := IcmpSendEcho( HNDFile, Endereco^, null, 0, Ip, Icmp, sizeof(Icmp), DWORD(5000)); Destino.S_addr := icmp.source; Memo1.Lines.Add('Ping ' + Edit1.text); end; IcmpCLoseHandle(HNDFile); FreeLibrary(HNDicmp); WSACleanup(); end; У данного примера есть один недостаток - программа не воспримет доменное имя, только IP-адресс. Для пользователей NT не используйте функцию IcmpCloseHandle. Это всё….. Ну и в конце полный исходный код примера: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock, StdCtrls; type IPINFO = record Ttl: char; Tos: char; IPFlags: char; OptSize: char; Options: ^char; end; type ICMPECHO = record Source: longint; Status: longint; RTTime: longint; DataSize: Shortint; Reserved: Shortint; pData: ^variant; i_ipinfo: IPINFO; end; TIcmpCreateFile = function(): integer; {$IFDEF WIN32}stdcall; {$ENDIF} TIcmpCloseHandle = procedure(var handle: integer); {$IFDEF WIN32}stdcall; {$ENDIF} TIcmpSendEcho = function(var handle: integer; endereco: DWORD; buffer: variant; tam: WORD; IP: IPINFO; ICMP: ICMPECHO; tamicmp: DWORD; tempo: DWORD): DWORD; {$IFDEF WIN32}stdcall; {$ENDIF} type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var wsadt: wsadata; icmp: icmpecho; HNDicmp: integer; hndFile: integer; Host: PHostEnt; Destino: in_addr; Endereco: ^DWORD; IP: ipinfo; Retorno: integer; dwRetorno: DWORD; x: integer; IcmpCreateFile: TIcmpCreateFile; IcmpCloseHandle: TIcmpCloseHandle; IcmpSendEcho: TIcmpSendEcho; begin if (edit1.Text = '') then begin Application.MessageBox('Digite um HostName ou um End. IP', 'Error', MB_OK); exit; end; HNDicmp := LoadLibrary('ICMP.DLL'); if (HNDicmp <> 0) then begin @IcmpCreateFile := GetProcAddress(HNDicmp, 'IcmpCreateFile'); @IcmpCloseHandle := GetProcAddress(HNDicmp, 'IcmpCloseHandle'); @IcmpSendEcho := GetProcAddress(HNDicmp, 'IcmpSendEcho'); if (@IcmpCreateFile = nil) or (@IcmpCloseHandle = nil) or (@IcmpSendEcho = nil) then begin Application.MessageBox('Erro pegando endereзos ICMP', 'Error', MB_OK); FreeLibrary(HNDicmp); end; end; Retorno := WSAStartup($0101, wsadt); if (Retorno <> 0) then begin Application.MessageBox('Nгo foi possнvel carregar WinSockets', 'WSAStartup', MB_OK); WSACleanup(); FreeLibrary(HNDicmp); end; Destino.S_addr := inet_addr(Pchar(Edit1.text)); if (Destino.S_addr = 0) then begin Host := GetHostbyName(PChar(Edit1.text)); end else begin Host := GetHostbyAddr(@Destino, sizeof(in_addr), AF_INET); end; if (host = nil) then begin Application.MessageBox('Host nгo encontrado', 'Error', MB_OK); WSACleanup(); FreeLibrary(HNDicmp); exit; end; memo1.Lines.Add('Pinging ' + Edit1.text); Endereco := @Host.h_addr_list; HNDFile := IcmpCreateFile(); for x := 0 to 4 do begin Ip.Ttl := char(255); Ip.Tos := char(0); Ip.IPFlags := char(0); Ip.OptSize := char(0); Ip.Options := nil; dwRetorno := IcmpSendEcho( HNDFile, Endereco^, null, 0, Ip, Icmp, sizeof(Icmp), DWORD(5000)); Destino.S_addr := icmp.source; Memo1.Lines.Add('Pingou ' + Edit1.text); end; IcmpCLoseHandle(HNDFile); FreeLibrary(HNDicmp); WSACleanup(); end; end.
Вопрос # 1 046 Приветствую, уважаемые эксперты! Как можно реализовать запрос на подтверждение закрытия окна?
Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Гадлевский Олег Вячеславович!
Вопрос # 1 047 Доброго времени суток, уважаемые эксперты!
Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Alexx! var abm:array of TBitmap; i:integer; b:byte; fs:TFilestream; ms:TMemoryStream; s :string[10];//размер должен быть задан! begin fs := TFileStream.create('filename', fmCreate); b:=10; fs.write(b,1); b:=20; fs.write(b,1);//сигнатуру записали fs.write(length(abm),4); for i:= 0 to length(abm)-1 do begin s := 'namepict'; fs.write(s[1], 10); ms:=TMemoryStream.create; abm[i].SaveToStream(ms); fs.write(ms.size,4); ms.SaveToStream(fs); ms.free; end; end;чтение подобно var abm:array of TBitmap; i, l,sz:integer; b:byte; fs:TFilestream; ms:TMemoryStream; s :string[10];//размер должен быть задан! begin fs:=TFileStream.create('filename', fmOpenRead); fs.read(b,1);fs.read(b,1);//вычитали сигнатуру. дальше может проверку сделать fs.read(l,4); // кол-во объектов SetLength(abm,l); for i:=0 to l-1 do begin abm[i]:=TBitmap.create; fs.read(s[1], 10);//метку прочитали fs.read(sz,4);//размер прочитали ms:=TMemorySream.create; ms.copyFrom(fs, sz); abm[i].loadFromStream(ms); ms.free; fs.position := fs.position + sz; end; fs.free; end;приимущество этого способа - что сделав метку, можно организовать по ним case и грузить самые разнообразные объекты (TStringList тоже умеет сохранятся в поток). а если объект, сохранённый в потоке нам неизвестен, то всегда можно пропустить его. по поводу второго вопроса. преобразовать изображение в "строку". Это просто. сохранение в строку (c Image в Memo) var ms:TMemoryStream; s:string; i:integer; b:byte; begin ms := TMemoryStream.Create; Image1.Picture.Bitmap.SaveToStream(ms); ms.Position := 0; setlength(s,ms.size*2); for i := 0 to ms.size-1 do begin ms.Read(b,1); s[i*2+1] := inttohex((b and $F0) shr 4,1)[1]; s[i*2+2] := inttohex((b and $F),1)[1]; end; memo1.Lines.Text := s; ms.Free; end;и обратно var ms:TMemoryStream; s:string; i:integer; b:byte; begin s:=memo1.Lines.text; ms := TMemoryStream.Create; for i:=0 to (length(s)-2) div 2 do begin b := Strtoint('$'+copy(s, i*2+1,2)); ms.Write(b,1); end; ms.Position := 0; Image2.Picture.Bitmap.LoadFromStream(ms); ms.Free; end;
Вопрос # 1 048 Здравствуйте, уважаемые эксперты! У меня на форме имеется TChart и TStringGrid(график уже построен,а таблица уже заполнена,график или графики построены соответственно по таблице).Мне бы сохранить таблицу,а под ней и график в вордовском документе.Помогите пожалуйста, подкинте код.
Ответ #1. Отвечает эксперт: Николай Рубан Здравствуйте, GAZ! Приложение:
Ответ #2. Отвечает эксперт: Feniks Здравствуйте, GAZ!
» Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи". Последние 5 уроков: Новых уроков пока что нет. Компоненты Ribbon в DelphiRibbon - тип интерфейса в GUI приложениях, основанный на тулбарах, разделенных табами. Последние приложения, выпущенные компанией Microsoft, применяют эту форму интерфейса, главной частью которой является модульная лента. После выпуска Microsoft Windows Vista и Office 2007 данный тип пользовательского интерфейса стал довольно популярен. Используем возможности Ribbon Controls в приложениях DelphiВпервые компоненты Ribbon были включены в состав CodeGear RAD Studio 2009 (Delphi 2009) и вызвали большой интерес среди разработчиков. Всего закладка содержит пять компонентов: TRibbon, TRibbonComboBox, TRibbonSpinEdit, TRibbonScreenTipsManager и TRibbonScreenTipsPopup. Сразу обращу Ваше внимание на то, что использовать Ribbon Вы сможете только в связке с компонентом ActionManager со страницы Additional палитры компоентов. Так что, если Вы не имеете представления как действует ActionManager – то Вам вряд ли удастся реализовать полноценный интерфейс, да и вообще использовать Ribbon Controls в своем приложении. Для того, чтобы разобраться с работой компонентов Ribbon, я предлагаю Вам разработать простенькое приложение, например текстовый редактор наподобие WordPad’а. Итак, открываем Delphi и укладываем на форму следующие компоненты:
В итоге у Вас должен получиться примерно следующий вид будущего приложения: Теперь начнем настройку. Выделяем TRibbon и в свойстве ActionManager указываем ActionManager1. По умолчанию Ribbon использует тему оформления Luna. Если Вы хотите изменить внешний вид панели инструментов, то можете сделать это изменяя свойство Style. Всего можно использовать 3 стандартные схемы: Luna, Obsidian и Silver. Теперь изменим свойство Caption на что-нибудь другое, например назовем нашу будущую программу "WordPad 2009". Переходим к ActionManager. В свойстве FileName указываем имя файла, в котором будут храниться пользовательские настройки панели. Если файл не указать, то при работе с программой настройки не сохранятся и при каждом запуске панель инструментов будет выстраиваться по умолчанию. В свойстве Images выбираем наш ImageList1. Вы можете также указать где у вас будут храниться картинки для неактивных кнопок и пр., но это уже дополнительные "навороты", поэтому ограничимся одним ImageList’ом. У компонента ImageList меняем свойства Height и Width на значение 32, а свойство DrawingStyle устанавливаем в dsTransperent. Загружаем в ImageList картинки, которые Вы будете использовать в приложении и переходим снова к Ribbon. Выделяем Ribbon, жмем правую кнопку мыши и в меню выбираем Add Tab – таким образом мы создали страницу RibbonPage1, теперь переходим на эту страницу, снова жмем правую кнопку и выбираем в меню Add Group – добавляем RibbonGroup1. Вот в RibbonGroup'ы и добавляются все элементы управления. Как видите иерархия компонента довольна проста. Теперь переходим к RibbonPage1 и меняем свойство Caption на, например, "Редактор", а у RibbonGroup1 изменяем на "Работа с текстом". Теперь посмотрите на результат – чего-то не хватает? Конечно не хватает самого главного – кнопки меню. Чтобы добавить кнопку меню выбираем Ribbon, жмем правую кнопку мыши и в меню выбираем Add Application Menu. В итоге этих нехитрых действий у Вас должно получиться примерно следующее:
Заметьте – мы ещё не написали ни одной строчки кода, только настраиваемся на работу. Теперь настроим вид кнопки меню. Для этого переходим к компоненту TRibbon и раскрываем группу свойств Application Menu, находим там пункт Icon и загружаем любую картинку в формате *.ico. По желанию, можете изменить свойство IconSize на isLarge, isMedium или isSmall. Я оставил это свойство по умолчанию в значении isMedium. Теперь Наше приложение выглядит ещё более "представительно". Осталось самое интересное – настроить все действия. А здесь придётся-таки обратить особое внимание на ActionManager. Делаем двойной клик на ActionManager и в открывшемся окне переходим на вкладку Actions (Действия). Давайте для начала добавим одно из стандартных свойств, например, открытие файла. Для этого нажимаем на стрелку рядом с кнопкой New Action и в появившемся списке выбираем пункт New Standard Action. В итоге Вы получите целый список стандартных действий, которые поддерживаются в ActionManager. Нам необходимо свойство из группы File под названием TFileOpen. Выбираем свойство и жмем Ok. Теперь в окне ActionManager'а выбираем появившуюся категорию File, а в списке Actions наше добавленное свойство, которое обозначено там по умолчанию как Open... Все, что от нас сейчас требуется – настроить вид кнопки меню, отвечающей за выполнение этого действия и написать пару строк кода. Для этого переходим в Object Inspector, который, кстати сказать, должен сейчас у Вас выглядеть так, как показано на рисунке. Здесь от нас требуется изменить свойства:
Теперь, чтобы добавить это действие на панель инструментов, просто схватите его мышкой и перетяните на RibbonGroup. Теперь выберите в RibbonGroup это действие и найдите в Object Inspector’e свойство Command Properties – Button Size и измените его на bsLarge. Вот теперь наша кнопка выглядит действительно как кнопка. Можете поэкспериментировать со всеми свойствами – так Вы сможете легко научиться встраивать в панель не только кнопки, но и чекбоксы, комбобоксы и прочие элементы управления. Теперь делаем двойной клик на нашей кнопке и переходим наконец-то к программированию. Описываем следующее событие: procedure TForm1.FileOpen1BeforeExecute(Sender: TObject); begin RichEdit1.Lines.LoadFromFile(FileOpen1.Dialog.FileName) end; Вот и все, что требуется описать, чтобы загрузить содержимое файла в RichEdit. Аналогичным образом Вы можете настроить абсолютно любые действия, причем необязательно стандартные. И последнее, что хотелось бы отметить – это то, что вы можете использовать на панелях TRibbon и стандартные элементы управления, например стандартный ComboBox, но при этом может возникнуть ряд проблем, которые я рассмотрю ниже. Проблемы при работе с Ribbon ControlsКак говорится, и в этой бочке мёда нашлась-таки ложка дёгтя. Несмотря на свою красоту и функциональность, Ribbon Controls в Delphi пока ещё сыроват, я бы даже сказал очень сыроват. Например, присутствует ряд проблем при работе с компонентами в Design-Time – иногда размещенные на закладке компоненты ни в какую не хотят выделяться мышкой. Вроде руки не кривые, жмешь куда надо, а в Инспекторе появляются свойства совсем не того компонента или Action’а. Но это весьма несущественные проблемки, которые наверняка будут исправлены в ближайшем будущем. Основная проблема с которой я столкнулся заключается в том, что при размещении на панелях большого количества стандартных компонентов Ribbon вдруг перестает напрочь реагировать на любые действия – выдает ошибку доступа к ячейкам памяти и умирает, что в итоге приводит к перезагрузке Delphi. Причём перезагрузка восстанавливает работу только оболочки, а проект так и не оживает. Также при написании этой статьи натолкнулся на такой глюк – если вы переносите компоненты Ribbon с одной формы на другую, то Вам придётся перенастраивать все действия по-новой. Может это и не глюк, а сделано специально во избежание более серьезных проблем, но уж очень не хотелось бы переписывать по-новой, скажем так, действий 50-60... Будущее Ribbon Controls в DelphiНесмотря на ряд отмеченных мною недостатков, я все-таки остаюсь оптимистом и надеюсь, что в новой версии RAD Studio все эти недостаки и шероховатости будут убраны, а на их месте появятся новые компоненты с новыми глюками возможностями. В настоящее время я использую Ribbon Controls исключительно в целях саморазвития, т.е. не пишу программы "под заказ" с использованием этих компонентов, т.к. не хотелось бы пролетать со сроками сдачи из-за досадных недоразумений при работе с компонентами. Источник: www.webdelphi.int.ru Оценить данную статью, а также оставить свои комментарии Вы можете на нашем сайте. Перейти на страницу со статьёй »
Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения Уважаемые читатели! Отправляйте полезные компоненты/модули, исходники, собственные программы/игры, документацию - книги, учебники и они будут размещены на сайте.
Почему Дед Мороз не может существовать 1. Ни один Северный Олень не умеет летать. Но если честно, то мы еще не изучили 300.000 живых существ. И большинство из них - бактерии. Правда это не означает, что одно из существ не может оказаться летающим Северным Оленем. 2. На земле живет 2 миллиарда детей (люди, не достигшие 18 лет). Дед Мороз не приходит к детям мусульман, индусов, евреев и буддистов. Следовательно, можно откинуть 81.1%. Остается 378 миллионов детей. Допустим, что в каждой семье 3 ребенка. Получается 126 миллионов семей. Предположим, что в каждой из них только один хороший ребенок, заслуживший подарок. 3. Из-за разницы во времени и движения земли у Деда Мороза есть 31 час, чтобы доставить подарки, если считать, что он двигается с Запада на Восток (что логично). Получается, что он должен посещать 1129 семьи в секунду. Таким образом, он может потратить только 1/1000 секунды на то, чтобы остановится, вылезти из повозки, запрыгнуть в камин, положить подарок, вылезти назад через камин, залезть в повозку и лететь к другому дому. Допустим, что расстояние между домами равно 0,78 миль, тогда ему нужно проехать всего 75,5 миллионов километров. Но мы еше не учли, что за 31 час Дед должен, так же, делать то, что и все нормальные люди: есть и справлять нужду. Чтобы все это сделать, нужно двигаться со скоростью 650 миль в секунду. Для сравнения: самая быстрая машина, изобретенная человеком (спутник Ulуssеs), двигается со скоростью 27,4 миль в секунду, а обычный Северный Олень двигается, самое быстрое, со скоростью 15 миль в час. 4. Теперь рассмотрим подарки. Если каждый ребенок получит коробку ЛЕГО среднего размера (1.8 кг), получается, что повозка сама по себе весит 314.100 тонн, не считая Деда Мороза, который, по слухам, очень очень толстый. Обычный Северный Олень поднимает 150 кг. Допустим, что Летающие олени в десять раз сильнее. Тогда нам нужно 214.200 оленей, а не 6-8, на которых он, опять таки по слухам, ездит. И чем больше оленей, тем тяжелее повозка. Получается 353.430 тонн с оленями. Для сравнения: Корабль Quееn Еlizаbеth легче в четыре раза. 5. В результате получаем, что тело, весящее 353.000 тонн, двигается со скоростью 650 миль в секунду. Сила трения, возникающая при таком движении, воспламеняет Северных Оленей. При этом каждый Олень выделяет 14,3 квинтиллиона энергии, которая сжигает и Оленей и повозку. Получаем, что Олени и повозка уничтожаются за 4,26 тысячных секунды. Вывод: Если Дед Мороз и существовал, то он, скорее всего, уже мертв. Источник: bayanov.net :)) Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они будут опубликованы в ближайших выпусках рассылки. WWW: http://www.delphi.int.ru/ E-mail: admin@delphi.int.ru; support@delphi.int.ru
Архив рассылки: http://subscribe.ru/archive/comp.soft.prog.delphifaq Ведущий рассылки: Ерёмин Андрей
|
В избранное | ||