Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 4

Автор: OdesitVadim
Дата сообщения: 23.07.2008 18:03
Скорее всего выставлен свойство Style в отличное от csDropDown. В некоторые другие свойства предназначены для ручной отрисовки списков. Если это не используется, то надо выставить правильный стиль.
Автор: MsdLamer
Дата сообщения: 23.07.2008 18:48
Здравствуйте. Подскажите пожалуйста как можно удалить все знаки равно из текстового файла. При этом не удаляя всю строчку. Спасибо.
Автор: RomanTim
Дата сообщения: 24.07.2008 07:16
MsdLamer
Код: [no]sl := TStringList.Create;
sl.LoadFromFile(filename);
for i := 0 to sl.Count - 1 do
sl[i] := StringReplace(sl[i], '=', '', [rfReplaceAll]);
sl.SaveToFile(filename);
sl.Free;[/no]
Автор: MsdLamer
Дата сообщения: 24.07.2008 07:52
Спасибо. И еще один вопрос как можно сделать если имеется текстовый файлик следующего содержания:
2 // числа могут быть обсолютно разными но 3 цифры это максимум
22434234234234 // по любому больше 3-х цифр.
234234234234
56565656565
24
09099999999999
104
989898989898
777878787
67667676767676
можно сделать так чтобы это один большой файл разбить на маленькие:
Допустим 2.тхт содержит
2
22434234234234
23423423423423

24.тхт содержит
24
09099999999999
и.т.д т.е . чтобы верхний номер был названием файла. Спасибо.
Автор: Narrator
Дата сообщения: 24.07.2008 09:34
OdesitVadim

Цитата:
Скорее всего выставлен свойство Style в отличное от csDropDown.


Нет. С этим все нормально. Тоже так подумал вначале. Но тут даже когда новый Combobox, например, положить на форму и заполнить в дизайнере Items, всеравно чистый при выполнении. Такое впесатление, что при установке значения ItemIndex чистится.
Автор: deks
Дата сообщения: 24.07.2008 09:44
MsdLamer

что нибудь аналогичное предыдущему, но примерно такое..

var
aFileNAme : string;

aFileName := '';
sl := TStringList.Create;
sl2 := TStringList.Create;
sl.LoadFromFile(filename);
// в sl будем хранить оригинальный файл, а в sl2 записывать текущий "маленький" файл
for i := 0 to sl.Count - 1 do begin
// проанализируем текущую строку в файле sl
if Length(sl[i]) <= 3 then begin
// если она сигнализирует о начале нового файла, то запишем накопленные данные:
if (sl2.Count > 0) and (aFileNAme <> '') then begin // записывать будем только в том случае, если данные имеются

sl2.SaveToFile(aFileName + '.txt');
sl2.Clear;
aFileName := sl[i];
end;

sl2.Add(sl[i]); // добавим текущую строку в файл
end;

// запишем оставшиеся данные:
if (sl2.Count > 0) and (aFileNAme <> '') then
sl2.SaveToFile(aFileName + '.txt');

FreeAndNil(sl);
FreeAndNil(sl2);
Автор: MsdLamer
Дата сообщения: 24.07.2008 09:49
Блин всем спасибо огромное за помощь!! Все с пояснениями супер....))) Кайфовый форум.
Автор: OdesitVadim
Дата сообщения: 24.07.2008 10:15
Narrator
Ну в таком случае "угадать" сложнее.
Если бы форма, которая видна при дизайне и в запущенном приложении отличались в компонентах - тогда другое дело, эт мы знаем.

Может просто на форме есть какой-то "специфический сторонный компонент"? Например для скинов.
у ComboBox/ListBox наблюдается полоса прокрутки (ну если она действительно нужна по размеру.
цвет шрифта случайно не совпадает с цветом фона?
(тут два варианта:
- либо было решено разукрасить форму всемя цветами радуги. а многие компоненты наследуют эти цвета от родительского компонента - обычно формы.
- был поставлен компонент TXPManifest. И цвета с подключёнными стилями немного не совпадают с теми, что были в дизайне. Наблюдал когда то такое с TMainMenu, при этом в в винде была настроена очень странная тема в чёрно-зелённых тонах)

В FormCreate/FormShow и так далее нет какого то "хорошего кода"?
Воспроизводиться ли проблема на других формах этого проекта. А на другом проекте. А если этот проект запустить на другом компе?

Можно ещё пару вариантов привести, но сложно гадать на кофейной гуще.
Автор: MsdLamer
Дата сообщения: 24.07.2008 11:46
И еще один вопрос подскажите пожалуйста как можно в текстовом файле оставить нужные куски текста? Допустим есть текстовый файл с содежимым:
Саша 47 ....
какой-то текст
НатаШа 56....
дальше не нужный текст
Саша 78....
какой-то текст
НатаШа 71.....
нужно чтобы осталось
Саша 47 ....
какой-то текст
НатаШа 56....
Саша 78....
какой-то текст
НатаШа 71.....
т.е. нужно чтобы остались только нужные куски. Саша и Наташа в одной строке не попадаются. Спасибо.
Автор: Dimoniusis
Дата сообщения: 24.07.2008 21:34
deks у тебя ошибка.

Цитата:
if Length(sl[i]) <= 3 then begin
// если она сигнализирует о начале нового файла, то запишем накопленные данные:
if (sl2.Count > 0) and (aFileNAme <> '') then begin // записывать будем только в том случае, если данные имеются
sl2.SaveToFile(aFileName + '.txt');
sl2.Clear;
aFileName := sl[i];
end;


Правильно:

Цитата:
if Length(sl[i]) <= 3 then begin
// если она сигнализирует о начале нового файла, то запишем накопленные данные:
if (sl2.Count > 0) and (aFileNAme <> '') then // записывать будем только в том случае, если данные имеются
sl2.SaveToFile(aFileName + '.txt');

sl2.Clear;
aFileName := sl[i];
end;
Автор: RomanTim
Дата сообщения: 24.07.2008 21:51
MsdLamer
У стринглиста ненужные строки можно удалять методом Delete
Автор: Narrator
Дата сообщения: 25.07.2008 14:26
OdesitVadim

Цитата:
...Можно ещё пару вариантов привести, но сложно гадать на кофейной гуще

Действительно - гадание на кофейной гуще. Проблема решилась. Суть - 2+3<>3+2. Я поменял в dpr порядок(время?) создания формы.
Было...
Код:
...
Application.CreateForm(TToolsForm, ToolsForm);
SplashForm.Hide;
SplashForm.Free;
...
Автор: OdesitVadim
Дата сообщения: 25.07.2008 15:28
Narrator
Правило раз:
Без надобности не правь dpr файл.
Правило два:
Если ты всё таки решился править, подумай, а понимаешь ли ты, что же ты делаешь.

В делфи до 7 версии включительно, в 2005-2006 и 2007 одно и тоже изменение может давать разные эффекты. То есть имеем три разные пути повидения.

Скорее всего у тебя Делфи путалась, какая форма главная. Просто не смогла правильно инициализировать некоторые внутриние структуры.

Но если уж лезть в эти дебри, то стоит помнить, что до вызова метода Application.Run приложение не обрабатывает Windows сообщения. Точнее обрабатывает, но крайне избирательно и не стоит надеятся на это. Поэтому, к примеру, в SplashForm не будет работать таймер и может не обновлятся. Решается просто - вызываем метод Update формы по мере надобности в обновлении.
Автор: Narrator
Дата сообщения: 25.07.2008 18:01

Цитата:
Без надобности не правь dpr файл.

так не правил же... изначально...
Повторюсь. Правил код только в MainForm. Вылезло в ToolsForm.

Цитата:
одно и тоже изменение может давать разные эффекты. То есть имеем три разные пути повидения.

Какие изменения и это где-то описано? Ткни, чтоб знал.

Цитата:
Скорее всего у тебя Делфи путалась, какая форма главная.

Чего ей путаться? В свойствах проекта явно задано какая из форм главная. К тому же она первой в dpr создается.

Цитата:
...до вызова метода Application.Run приложение не обрабатывает Windows сообщения. Точнее обрабатывает, но крайне избирательно

Ну... если следовать этой мысли, то тогда получается, что создание любой формы до Run не гарантированно. Все контролы создаются и работают через виндовые сообщения.


Автор: Frodo_Torbins
Дата сообщения: 25.07.2008 19:30
Narrator
Попробуйте свою прогу под EurekaLog погонять, можно даже под триальной версией. Уверен, узнаете о своей проге много нового.
Автор: SZap
Дата сообщения: 25.07.2008 21:41
Уважаемые, помогите пожалуйста...
Задача в следующем:
Есть некое приложение (написанное ранее на Delphi) состоящее из нескольких окон на которых располагаются компоненты PageControl, Panel ну и т.д. с данными...
Необходимо написать утилиту для изменения некоторых свойств компонентов (Visible, Align, Enabled) в этом приложении в run-time.
Саму форму я нахожу без проблем, точнее hWnd, а что и как делать дальше не понимаю,( Как прочитать и изменить свойства компонентов в другом приложении?
Автор: Frodo_Torbins
Дата сообщения: 26.07.2008 10:15
SZap
По большому счету никак. Можно изменить только то, что контролируется вин. сообщениями.
Хотя если прога использует рантайм пакеты, может и удастся как нибудь к ней подцепится.
Автор: SZap
Дата сообщения: 26.07.2008 14:52
Что такое рантайм пакеты? Программа написана с использованием стандартных компонентов Delphi...
Автор: lerthe61
Дата сообщения: 26.07.2008 15:21
SZap
Изменять свойства при помощи классов VCL можно устроить, но это сложно.
Гораздо проще делать все то же используя просто WinAPI. Для того, что бы узнать какое сообщение надо послать что бы изменилось то или иное свойство, достаточно глянуть в саму реализацию VCL.
P.S. Я где-то в интернете встречал подобие библиотеке VCL, но там объекты можно было привязывать к уже созданным примитивам Windows (будь то кнопка или листбокс).
P.P.S. Runtime package - пакеты (обычно bpl) которые представляют собой библиотеки классов или функций используемых в программе. Подмена этих библиотек обычно представляет собой написание "обертки" над оригинальной библиотекой и обычно используется для изменения уже готов программ, код которых недоступен. Обычно такое решение занимаем много времени для реализации.
Автор: Frodo_Torbins
Дата сообщения: 26.07.2008 17:12
SZap
Сюда загляните: Основы работы с Win API в VCL-приложениях, особенно на определенные в делфи сообщения. Ну и сюда тоже: Работа с контролами чужого приложения.
Автор: Maks150988
Дата сообщения: 26.07.2008 18:47
Всем привет. Возникла необходимость выцепить всю таблицу маршрутизации. Не подскажите как это можно сделать?
Автор: ShIvADeSt
Дата сообщения: 27.07.2008 03:49
Maks150988
route print >myfile.txt
а потом отпарсить его, как хочешь.
Автор: V1s1ter
Дата сообщения: 27.07.2008 17:16
Narrator

Цитата:
Действительно - гадание на кофейной гуще. Проблема решилась. Суть - 2+3<>3+2. Я поменял в dpr порядок(время?) создания формы.
Было...
Код:
...
Application.CreateForm(TToolsForm, ToolsForm);
SplashForm.Hide;
SplashForm.Free;
...


Стало...
Код:
...
SplashForm.Hide;
SplashForm.Free;
Application.CreateForm(TToolsForm, ToolsForm);
...


Сразу отмечу, в SplashForm нет кода. Интересно то, что ToolsForm не правилась, а просто рос код программы в других местах.



Что бы сказать что-то конкретное надо больше кода, но и так ясно что указанные коды не равнозначны, пример в первом коде SplashForm теряет фокус ввода, а во втором нет, соответствующие события тоже не посылаются.
Намек - нельзя рассматривать порядок открытия/закрытия форм без анализа генерируемых и обрабатываемых сообщений, особенно взаимосвязанных.
Не гадайте на кофе, просто проанализируйте код, я думаю когда найдете в чем дело поймете, что делфи не причем.


Добавлено:
Narrator

Цитата:
Непонятное поведением Combobox и Listbox в одной из форм программы - пустые списки на этапе выполнения. Причем, у формы есть как заполненные в дизайнере значения Items, так и формируемые при создании формы. Если в отладчике проследить заполнеие или сформировать Messagebox с текстом значений Items, то все нормально. Когда же форма выводится на екран, все списки пустые


Сталкивался с подобным, удалял все вспомогательные/настроечные файлы проекта, например *.dsk, и "Build Project".
Автор: mvictor71
Дата сообщения: 27.07.2008 21:10
Всем привет
Вопрос к тем кто имеет опыт написания COM,Activex и т.д.

Можна ли, и если да, то как, определить метод с параметрами по умолчанию ??

В typelibe редакторе для параметра можна выставить [optional] [default]. Но, скоко я не экспериментировал на результирующий _tlb это никак не влияет

Есть какие нибудь мысли ?
Автор: Maks150988
Дата сообщения: 27.07.2008 22:21

Цитата:
route print >myfile.txt
а потом отпарсить его, как хочешь.

Дык блин и в этом проблема. Фиг знает каким боком парсить... Но задача примерно такова. Из всего этого месива мне нужны только все постоянные маршруты с их сетевыми адресами и маской сети если она есть.
Автор: unni
Дата сообщения: 27.07.2008 22:30
Парсить можно при помощи: TRegExpr старого такого модуля, либо регулярными выражениями .Net.

А вообще можно было глянуть внутрь pe-шника и увидеть:

Код:
iphlpapi.dll
76D55B3B 1B GetBestRoute
76D543F6 4 AllocateAndGetIpForwardTableFromStack
76D578C1 E DeleteIpForwardEntry
76D5B05C 3 AllocateAndGetIpAddrTableFromStack
76D57813 A CreateIpForwardEntry
76D542A3 27 GetIpAddrTable
76D5417E 2 AllocateAndGetIfTableFromStack

USER32.dll
77D5E0D7 31 CharToOemBuffA

WS2_32.dll
71A912F8 Ordinal 11
71A9401C Ordinal 12
71A941DA Ordinal 115
71A912A7 Ordinal 8
71A92BBF Ordinal 52

MSWSOCK.dll
71A451F3 1A inet_network
71A45158 19 getnetbyname
Автор: Maks150988
Дата сообщения: 27.07.2008 23:15
О, нашел на забугорном форуме и сделал пример.=)

[more]
program sample;

uses
Windows, Messages, Commctrl, SysUtils, IpExport,
IpHlpApi, IpTypes, IpIfConst, IpRtrMib, Winsock;

{$R dialog.res}
{$R ..\..\Lenin_XPStyle.RES}

var
hApp : Integer;

procedure CreateColumnsListview(hLV: HWND);
var
lvc : TLVColumn;
begin
lvc.mask := LVCF_TEXT or LVCF_WIDTH or LVCF_FMT;
lvc.fmt := LVCFMT_CENTER;
lvc.pszText := '#';
lvc.cx := 26;
ListView_InsertColumn(hLV, 0, lvc);
lvc.mask := LVCF_TEXT or LVCF_WIDTH;
lvc.pszText := 'Постоянный маршрут';
lvc.cx := 160;
ListView_InsertColumn(hLV, 1, lvc);
lvc.mask := lvc.mask or LVCF_FMT;
lvc.fmt := LVCFMT_RIGHT;
lvc.pszText := 'Маска сети';
lvc.cx := 160;
ListView_InsertColumn(hLV, 2, lvc);
end;

function IpAddrToString(Addr : DWORD) : string;
var
inad : in_addr;
begin
inad.s_addr := Addr;
Result := inet_ntoa(inad);
end;

procedure DisplayRoutingTable;
var
ForwardTable : PMibIpForwardTable;
ForwardRow : TMibIpForwardRow;
Dest : string;
Gate : string;
Size : ULONG;
I : Integer;
lvi : TLVItem;
Destination : string;
GateWay : string;
begin
ZeroMemory(@lvi, SizeOf(lvi));
lvi.mask := LVIF_TEXT;
SendMessage(GetDlgItem(hApp, 101), LVM_DELETEALLITEMS, 0, 0);
SendMessage(GetDlgItem(hApp, 101), WM_SETREDRAW, Integer(FALSE), 0);
Size := 0;
if not GetIpForwardTable(nil, Size, True) = ERROR_BUFFER_OVERFLOW then Exit;
ForwardTable := AllocMem(Size);
try
if GetIpForwardTable(ForwardTable, Size, True) = ERROR_SUCCESS then
begin
for I := 0 to ForwardTable^.dwNumEntries - 1 do
begin
ForwardRow := ForwardTable^.Table[I];
Dest := IpAddrToString(ForwardRow.dwForwardDest);
Gate := IpAddrToString(ForwardRow.dwForwardNextHop);
if ((Destination = '') or (Pos(Destination, Dest) > 0)) and
((GateWay = '') or (Pos(GateWay, Dest) > 0)) then
begin
lvi.mask := LVIF_TEXT;
lvi.iItem := I;
lvi.iSubItem := 0;
lvi.pszText := '';
SendMessage(GetDlgItem(hApp, 101), LVM_INSERTITEM, 0, Integer(@lvi));
lvi.iSubItem := 1;
lvi.pszText := PChar(Format('%17s', [Dest]));
SendMessage(GetDlgItem(hApp, 101), LVM_SETITEM, 0, Integer(@lvi));
lvi.iSubItem := 2;
lvi.pszText := PChar(Format('%17s', [IpAddrToString(ForwardRow.dwForwardMask)]));
SendMessage(GetDlgItem(hApp, 101), LVM_SETITEM, 0, Integer(@lvi));
end;
end;
end;
finally
FreeMem(ForwardTable);
end;
SendMessage(GetDlgItem(hApp, 101), WM_SETREDRAW, Integer(TRUE), 0);
end;

function MainDlgProc(hWnd : HWND; uMsg : UINT; wParam : wParam; lParam : lParam) : BOOL; stdcall;
begin
Result := FALSE;
case uMsg of
WM_INITDIALOG :
begin
hApp := hWnd;
CreateColumnsListview(GetDlgItem(hApp, 101));
SendMessage(GetDlgItem(hApp, 101), LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT or LVS_EX_CHECKBOXES);
end;
WM_COMMAND :
begin
case LoWord(wParam) of
102 : DisplayRoutingTable;
end;
end;
WM_DESTROY, WM_CLOSE :
begin
PostQuitMessage(0);
end;
end;
end;

begin
InitCommonControls;
DialogBox(hInstance, MAKEINTRESOURCE(101), 0, @MainDlgProc);

end.

[/more]

Однако это тупо в лоб сразу все маршруты, а нужны именно постоянные. Нет ли спооба?
Автор: MsdLamer
Дата сообщения: 28.07.2008 09:14
Подскажите пожалуйста как обрезать в текстовом файле длину строк до одного слова, и в конце оставщегося слова добавить ;.
Например:
есть текст:
Иван ПетроВ
Сергей Коновалов
Саша Пупкин
и.т.д.
а должно остаться:
Иван;
Сергей;
Саша;
и.т.д
Спасибо.
Автор: V1s1ter
Дата сообщения: 28.07.2008 09:23
MsdLamer

Зайди на сайт Королевство Делфи http://www.delphikingdom.com/ ,
там есть раздел для новичков и лабораторным работам.
Автор: MsdLamer
Дата сообщения: 28.07.2008 09:27
Хорошо спасибо. Пойду схожу...)))

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.