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

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

Автор: bornbill
Дата сообщения: 17.04.2009 20:50
Нужно обойти все формы, на них все элементы label и взять с них текст.
Заранее благодарен.
Автор: zvAndrey
Дата сообщения: 17.04.2009 21:49

Цитата:
Нужно обойти все формы, на них все элементы label и взять с них текст.



Код:
for idx := 0 to Screen.FormCount-1 do
for n := 0 to Screen.Forms[idx].ComponentCount-1 do
if (Screen.Forms[idx].Components[n] is TLabel) then
ShowMessage((Screen.Forms[idx].Components[n] as TLabel).Caption);
Автор: Dmitriy05
Дата сообщения: 18.04.2009 15:32
Проблема решилась отловом SC_Restore и принудительным установом позиции


Код:
procedure TMainForm.WMSyscommand(var msg: TWmSysCommand);
begin
inherited;
case (msg.CmdType and $FFF0) of
sc_restore :
begin
Left:=(screen.Width - width) div 2;
Top:=(screen.Height - height) div 2;
end;
end;
end;
Автор: delover
Дата сообщения: 21.04.2009 21:58
Нашёл я наконец программу которая сохраняет дату файлов при переходе с летнего на зимнее время. Не в целях рекламы или саморекламы.
http__/cc.codegear.com/Item/24263
Просто знаю, что наверняка не я один из программистов пользуюсь двумя компьютерами. Кто в курсе, что такое синхронизация будет наверное удивлён - прога консольная, без единого компонента и в Delphi5 она компилится. Мой топик тогда прикрыли, наверное ни у кого не было ответов...

Добавлено:
да, и, сори за флуд, всё же удивляет безразличие к документу людей любящих оперировать фактами...
Автор: dr1v3
Дата сообщения: 22.04.2009 13:25
Пишу парсер html. Как можно вырезать из строки эти квадраты? Обычно я делаю в цикле if a[i]='x' then delete(a,i,1) А тут что писать? Как я понял, это символы перехода на новую строку
Автор: adli82
Дата сообщения: 22.04.2009 14:29
Если это символ перехода строки то можеш использовать следующий код:
if a[ i ]=#$D then delete(a,i,1)
ещо есть один символ которий тоже может быть "квадратиком":
if a[ i ]=#$A then delete(a,i,1)
Кстати эти символы относятся к управляющим, скорее всего они тебе не нужны вообще, я бы посоветовал убрать их все:
if a[ i ]<#32 then delete(a,i,1)

Автор: dr1v3
Дата сообщения: 22.04.2009 15:35
При таком раскладе: for i:=1 to length(a) do if w[a]<#32 then delete(a,i,1);
кол-во квадратиков уменьшается вдвое, но все не исчезают. Как узнать, что это за знак такой?
Автор: V1s1ter
Дата сообщения: 22.04.2009 15:42
dr1v3 и adli82

Цитата:
Кстати эти символы относятся к управляющим, скорее всего они тебе не нужны вообще, я бы посоветовал убрать их все:
if a[ i ]<#32 then delete(a,i,1)

А я бы посоветовал бы делать в два прохода, первым менять все символы <#32 на пробелы, а потом непрерывную последовательность пробелов заменить одним.
Такой подход позволит не попастся на крайних ситуациях, например, когда два слова
разделенные например парой $0D $0A, после удаления последных сольются в одно слово.
Хотя все зависит о целей и задач, поскольку при указанном подходе можно нарушить
форматирование абзаца.
Автор: adli82
Дата сообщения: 22.04.2009 15:47
У тебя логическая ошибка!!!
Так писать нельзя
for i:=1 to length(a) do if w[ a ]<#32 then delete(a,i,1);
1. Надо было написать :
for i:=1 to length(a) do if w[ i ]<#32 then delete(a,i,1);
(или может я чего-то непонял.....)
2. Всеравно не заработает. Смотри после удаления i-того символа строка стает короче и в i-той позиции уже какой-то новий символ, а ты его пропускаеш так-как i уже переходит на следующий символ. Рекомендую использовать следующий подход:

Код:
I:=1;
If Length(A)<>0 Then
Repeat
If A[ I ]<#32 Then Delete(A,I,1) Else Inc(I)
Until I>Length(A)
Автор: V1s1ter
Дата сообщения: 22.04.2009 16:13
adli82
dr1v3
Ну раз такая пьянка, то вот думаю для парсера пригодится:
[more]

Код:
function DeleteBeginChars(S, Chars: String): String;
function DeleteEndChars(S, Chars: String): String;
function DeleteChars(S, Chars: String): String;
{ Удаляте из строки S первые/последние/все символы перечисленные в Chars }
function CompressChar(S: String; const C: Char): String;
{ Заменяет в строке S непрырывную последовательность символов C на один символ C }
function GetWordCount(S: String; Sep: Char): Integer;
{ возвращает количество частей строки S, разделенных Sep }
{ GetWordCount('aaa|bbbb ccc|ddd', '|') = 3 }
function GetWord(S: String; N: Integer; Sep: Char): string;
{ возвращает N-ную (начиная с нуля) часть строки S, разделенную Sep }
{ GetWord('aaa|bbbb ccc|ddd', 1, '|') = 'bbbb ccc'}
function DelWord(S: String; N: Integer; Sep: Char; IsDelSep: Boolean): string;
{ удаляет N-ную (начиная с нуля) часть строки S, разделенную Sep }
{ GetWord('aaa|bbbb ccc|ddd', 1, '|', False) = 'aaa||ddd'}
{ GetWord('aaa|bbbb ccc|ddd', 1, '|', True) = 'aaa|ddd'}
function GetPartStr(S: String; N: Integer; Sep: Char; IsBefore: Boolean): string;
{ возвращает часть строки S, разделенную N-ым (начиная с нуля) разделителем Sep }
{ если IsBefore = True, то возвращается та часть строки, что перед разделителем иначе та что после }
{ GetPartStr('aaa|bbbb ccc|ddd|eeeeee|ffff', 2, '|', True) = 'aaa|bbbb ccc|ddd'}


function DeleteBeginChars(S, Chars: String): String;
var
L: Integer;
begin
L := 1;
while (L <= Length(S)) and (Pos(S[L], Chars) > 0) do Inc(L);
if L <= Length(S) then Result := Copy(S, L, Length(S)-L+1)
else Result := '';
end;

function DeleteEndChars(S, Chars: String): String;
var
L: Integer;
begin
L := Length(S);
while (L > 0) and (Pos(S[L], Chars) > 0) do Dec(L);
Result := Copy(S, 1, L);
end;

function DeleteChar(S: String; C: Char): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
if S[i] <> C then Result := Result+S[i];
end;

function DeleteChars(S, Chars: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
if Pos(S[i], Chars) < 1 then Result := Result+S[i];
end;

function CompressChar(S: String; const C: Char): String;
var
i, L: Integer;
begin
Result := '';
L := Length(S);
if L > 0 then begin
for i := 1 to L-1 do begin
if S[i] <> C then Result := Result+S[i]
else if S[i+1] <> C then Result := Result+C;
end;
Result := Result+S[L]
end;
end;

function GetWordCount(S: String; Sep: Char): Integer;
var
i: integer;
begin
Result := 0;
for i := 1 to Length(S) do
if S[i] = Sep then Inc(Result);
if Length(S) > 0 then Inc(Result);
end;

function GetWord(S: String; N: Integer; Sep: Char): string;
var
L, PB, PE, NW: integer;
begin
L := Length(S);
if L <> 0 then begin
PB := 0;
PE := 0;
NW := 0;
if N > 0 then begin
Inc(NW);
PB := 1;
while PB <= L do begin
if (Sep = S[PB]) then begin
if NW = N then begin
PE := PB+1;
Break;
end
else Inc(NW);
end;
Inc(PB);
end;
end
else PE := 1;
if PE = PB+1 then begin
while (PE <= L) and (Sep <> S[PE]) do Inc(PE);
Result := Copy(S, PB+1, PE-PB-1);
end
else Result := '';
end
else Result := '';
end;

function DelWord(S: String; N: Integer; Sep: Char; IsDelSep: Boolean): string;
var
L, PB, PE, NW: integer;
begin
L := Length(S);
if L <> 0 then begin
PB := 0;
PE := 0;
NW := 0;
if N > 0 then begin
Inc(NW);
PB := 1;
while PB <= L do begin
if (Sep = S[PB]) then begin
if NW = N then begin
PE := PB+1;
Break;
end
else Inc(NW);
end;
Inc(PB);
end;
end
else PE := 1;
if PE = PB+1 then begin
while (PE <= L) and (Sep <> S[PE]) do Inc(PE);
if IsDelSep then begin
if (PB = 0) and (PE < L) then Inc(PE)
else Dec(PB);
end;
Result := Copy(S, 1, PB)+Copy(S, PE, L-PE+1);
end
else Result := S;
end
else Result := S;
end;

function GetPartStr(S: String; N: Integer; Sep: Char; IsBefore: Boolean): string;
var
L, i, j: integer;
begin
L := Length(S);
i := 0;
j := -1;
while (i < L) and (j <> N) do begin
Inc(i);
if Sep = S[i] then Inc(j);
end;
if j = N then begin
if IsBefore then Result := Copy(S, 1, i-1)
else Result := Copy(S, i+1, L-i);
end
else Result := '';
end;
Автор: dr1v3
Дата сообщения: 22.04.2009 16:16
Я ошибся при копипасте, у меня просто другие названия переменных, должно было быть

Код: for i:=1 to length(a) do if a[i]<#32 then delete(a,i,1);
Автор: Postscriptum
Дата сообщения: 22.04.2009 16:45
Народ, подскажите, плиз - у меня в Delphi 2007 при создании нового проекта стала вдруг вместо unit1/Form1 создаваться unit2/Form2. Где это можно поправить?
Автор: adli82
Дата сообщения: 22.04.2009 16:52
Postscriptum
Просто в папке куда Delpi сохраняет файлы по умолчанию уже есь файл
Цитата:
unit1/Form1
если ето не удобно то убери ети файлы с папки куда Delphi сохраняєт по умолчанию в любое другое место (точного пути не помню но вроди в "Мои документы\RAD...\Projects")
Автор: xXxVov4ikxXx
Дата сообщения: 22.04.2009 18:23
У меня есть масив TImage, в зависимости от кое-какого значения, картинка должна менятся в некоторых из них. Я в Imagelist залил 3 картинки. Дальше пишу:

for i:=1 to n_ku4ki do //зміна картинок
begin
if StrToInt(Label_mas[i].Caption) > ((3*Options.UpDown_do.Position) div 4)
then Main.main_imglist.GetBitmap(2, Image_mas[i].Picture.Bitmap)
else if StrToInt(Label_mas[i].Caption) > 0
then Main.main_imglist.GetBitmap(1, Image_mas[i].Picture.Bitmap)
else Main.main_imglist.GetBitmap(0, Image_mas[i].Picture.Bitmap);
end;

При первом показе картики норм, тоесть соответствуют реальности, а вот когда они должны менятся, вот тогда беда: все остается таким как есть(( Кто может - помогите. Буду очень благодарен.
Автор: delover
Дата сообщения: 23.04.2009 15:50
xXxVov4ikxXx
Попробуй перед GetBitmap делать
[no]>Image_mas[i].Picture.Bitmap := nil;
>Main.main_imglist.GetBitmap(1, Image_mas[i].Picture.Bitmap)[/no]
Автор: MrZeRo
Дата сообщения: 23.04.2009 16:08
xXxVov4ikxXx
Может, перерисовать?
Image_mas[i].Update;
или
Image_mas[i].Invalidate;
Автор: delover
Дата сообщения: 23.04.2009 20:20
MrZeRo
А пофиг, переменная i будет фсегда одинакого.
Автор: ShIvADeSt
Дата сообщения: 24.04.2009 01:12
Самое оптимальное - поставить брейкпойнты и посмотреть отрабатывают события или нет.
Автор: xXxVov4ikxXx
Дата сообщения: 24.04.2009 18:11
Image_mas[i].Picture.Bitmap := nil; - помогло, но иногда не правильно работает. (остается пустая картинка)


Image_mas[i].Invalidate; - вот это помогло - можешь сказать, что делает эта команда?
Автор: afiget
Дата сообщения: 24.04.2009 19:12
xXxVov4ikxXx
Заставляется перерисовать указанный объект.
Автор: delover
Дата сообщения: 24.04.2009 19:26
xXxVov4ikxXx
Это лучше спросить у MrZeRo или у mr.Ironwin
Автор: eNIKmatic
Дата сообщения: 25.04.2009 11:43
Нужна помощь...
Как можно отследить нажатия клавиш в системе?
И где можно найти Chart таблицу всех клавиш?
Автор: Frodo_Torbins
Дата сообщения: 25.04.2009 12:14
eNIKmatic
Вам сюда: Hooks - аспекты реализации.
Автор: Aleksandr_N
Дата сообщения: 25.04.2009 21:44
Подскажите, никогда раньше подобного не приходилось делать.
Нужно в файле dpr проекта написать
STimer.OnTimer := STimerTimer;
Но если прописать
procedure STimerTimer(Sender: TObject);
то ошибка на STimer.OnTimer := STimerTimer;
Incompatible types: 'method pointer and regular procedure'

Подскажите как правильно.
Автор: Frodo_Torbins
Дата сообщения: 25.04.2009 22:27
Aleksandr_N
Ну вот например: http://delphikingdom.com/asp/answer.asp?IDAnswer=68885 Или еще лучше: Жизнь и смерть в режиме run-time.
Автор: Aleksandr_N
Дата сообщения: 25.04.2009 23:13
Frodo_Torbins
Это немножко не то. Это хорошо когда есть форма. А в консольных приложениях?
Автор: V1s1ter
Дата сообщения: 25.04.2009 23:53
Aleksandr_N
Писал подробно, а експлоер отказал...
Повторять неохота, поэтому к ратце так: Создаеш некий слас от TObjec в котором есть таймер и три процедуры Create, Destroy, TimerTimer.
В Create Создаеш экземплят таймера и пристваеваеш событие.
Долее где тебе надо создаеш экземпляр этого клосса. И пользуеш таймер через этот класс.
Автор: Aleksandr_N
Дата сообщения: 26.04.2009 01:48
Вышел из положения другим способом: встроил таймер в модуль.
Автор: V1s1ter
Дата сообщения: 26.04.2009 04:32
Aleksandr_N
По сути тоже самое.
Автор: Frodo_Torbins
Дата сообщения: 26.04.2009 10:12
Aleksandr_N

Цитата:
А в консольных приложениях?
...
Вышел из положения другим способом: встроил таймер в модуль.

Ну и как, работает? Просто в обычных консольных приложениях нету петли сообщений, поэтому стандартный таймер работать не должен.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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