Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 262
от 11.10.2005, 18:45

Администратор:Калашников О.А.
В рассылке:Подписчиков: 254, Экспертов: 46
В номере:Вопросов: 2, Ответов: 5


Вопрос № 27313: Здравствуйте, уважаемые эксперты! Вопрос, возможно, не новый, но: можно ли стандартными средствами Delphi(7) поместить на форме главное меню, занимающее на ней произвольное положение (т.е. как Caption)? Очень хотелось бы, чотбы оно было обрат...
Вопрос № 27319: Здравствуйте ! 1.2 Как можно преобразовать строку в массив по разделителю? 1.2 Как можно подсчитать количество подстрок по разделителю? 1.3 Как можно получить подстроку по индексу и разделителю? Разделитель может быть различным. Напр...

Вопрос № 27.313
Здравствуйте, уважаемые эксперты!
Вопрос, возможно, не новый, но: можно ли стандартными средствами Delphi(7) поместить на форме главное меню, занимающее на ней произвольное положение (т.е. как Caption)?
Очень хотелось бы, чотбы оно было обратно совместимо со стандартным меню, поскольку надо переписывать существующий проект.
Отправлен: 06.10.2005, 14:51
Вопрос задал: WR154 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: sir henry
Здравствуйте, WR154!
Боюсь, что нельзя. В его свойствах даже нет таких, которые позволяют его позиционировать в произвольном месте.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 06.10.2005, 15:22

Отвечает: Delphin
Здравствуйте, WR154!
Не очень понятно о чем вопрос. Но я думаю вы спрашиваете можно ли поставить главное меню допустим снизу или по середине.
Так вот отвечаю: Нельзя.
Но ты можеш использовать разные компоненты (честно таких не видел) или попробовать написать самому.
---------
Обращаться в ICQ: 66550088 (Ally) или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: Студент)
Отправлен: 06.10.2005, 15:46

Отвечает: Ерёмин Андрей
Здравствуйте, WR154!
Воспользуйтесь компонентами TActionManager, TActionMenuBar и TActionToolBar. Их можно размещать в любом месте и задавать для них произвольный размер. Кое-что переписать придётся, но немного.
---------
Windows 95, 98 - это количество глюков в процентах!
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 06.10.2005, 17:52


Вопрос № 27.319
Здравствуйте !
1.2 Как можно преобразовать строку в массив по разделителю?
1.2 Как можно подсчитать количество подстрок по разделителю?
1.3 Как можно получить подстроку по индексу и разделителю?
Разделитель может быть различным. Например см пр 1.

2. Код(см пр 2.) выдает ошибку в 1 сточке - нельзя результату указать тип массив. И если задать свой тип заместо array of array of integer:
type tmas: array of array of integer;
то все работает. Но присвоить значение переменной с этим типом не удается:
ms[1,1] := 5;
В чем тут дело? Как это можно обойти?

Приложение:

Отправлен: 06.10.2005, 16:54
Вопрос задал: 007Makc (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, 007Makc!
Этот Ваш вопрос, в отличие от предыдущего, более понятен. Надеюсь, что удасться на него ответить удовлетворяющим Вас образом. :)
2. Может быть я ошибаюсь, т.к. Вы не потрудились привести код, но возможно Вы неправильно выделяете память для динамического массива. Делать нужно так:
{$APPTYPE CONSOLE}
...
var
h: TMas;
begin
SetLength(h, 2);
SetLength(h[0], 2);
h[0,0]:=1;
h[0,1]:=2;
WriteLn(h[0,0], ' ', h[0,1]);
ReadLn;
End;
Поскольку массив у Вас многомерный, то память нужно выделять в два этапа - сначала для первого измерения, потом для второго.
1.3. Можно подстроку получить по индексу, разделитель тут не при чем.
SubStr:=Copy(str, Index, CountOfSymb);
т.е. сначала нужно получить длину подстроки (CountOfSymb).
1.2. Ответ в самом вопросе - нужно подсчитать количество разделителей. И если Вы правильно расставили разделители, то подстрок у Вас будет на одну больше. :)
{$APPTYPE CONSOLE}
Program CountSubStr;
var
s: string; {Строка}
r: char; {Символ-разделитель}
Count: word; {Кол-во подстрок}
i, l: integer;
Begin
Count:=0;
r:='~';
s:='inf~12~z~pl~false';
l:=Length(s);
For i:=1 to l do
If s[i]=r Then
Inc(Count);
Inc(Count);
WriteLn('Количество подстрок: ', Count);
End;
1.1. Здесь, как Вам уже писали, очень удобно использовать класс TStringList.
Переделаем немножко предыдущую программу:
{$APPTYPE CONSOLE}
Program StrToArray;
s: string; {Строка}
ss: string; {Подстрока}
r: char; {Символ-разделитель}
StrArray: TStringList; {Массив подстрок без Ваших разделителей}
i, l: integer;
Begin
StrArray:=TStringList.Create;
r:='~';
s:='inf~12~z~pl~false';
ss:='';
l:=Length(s);
For i:=1 to l do
If s[i]=r Then
Begin
StrArray.Add(ss);
ss:='';
End
Else
ss:=ss+s[i]
End.
Этим классом можно убить двух вальдшнепов:
- Получить массив подстрок;
- Определить количество подстрок - StrArray.Count
Очень удобная штука, скажу я Вам. Готовый массив можно выгрузить в файл не заморачиваясь на разделители, а потом одним приемом его загрузить:
StrArray.SaveToFile('MyFile.txt'); {Выгружаем массив в файл на диске}
StrArray.LoadFromFile('MyFile.txt'); {Загружаем массив из файла на диске}
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 06.10.2005, 18:51
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, это то, что я так долго искал.

Отвечает: Warrior
Здравствуйте, 007Makc!
На предыдущий я дал Вам рабочий код, где можна найти ответ и на этот.

procedure TForm1.Button1Click(Sender: TObject);
var st, st_stroka: TStrings;
i, j: integer;
stroka: string;
matrix_rezina: array of array of integer;
// вот динамический массив, т.е. размер его указываешь сам
begin
st:=TStringList.Create; // создаем список для загрузки в него файла
st.LoadFromFile('d:matrix.txt'); // загружаем файл в этот список
// в st.Count - количество строк в этом файле
SetLength(matrix_rezina,st.Count);
//вот почему у тебя ошибка
// необходимо задавать размер твоего массива

st_stroka:= TStringList.Create; // создаем список для загрузки в него строк
st_stroka.Delimiter:= ' '; // вот указывается твой разделитель между числами
// в данном случае разделитель - это пробел
// заганяем числа в твой массив
for i:=0 to st.Count-1 do
begin
st_stroka.DelimitedText:= st.Strings[i];
SetLength(matrix_rezina[i],st_stroka.Count);
for j:=0 to st_stroka.Count-1 do
begin
matrix_rezina[i,j]:= StrToInt(st_stroka[j]);
Memo1.Lines.Add('matrix['+IntToStr(i)+','+IntToStr(j)+']= '+IntToStr(matrix_rezina[i,j]));
end;
end;
st.Free; // после всего необходимо освободить память выделенную под списки
st_stroka.Free;
end;

вот тебе файл txt:
10 11 12 133
11 12 13 144
12 13 14 155
13 14 15 166
14 15 16 177
Поставь на форму Кномпу и Мемо. Возьми хорошенько и проанализируй этот код.
Ответ отправил: Warrior (статус: 1-ый класс)
Отправлен: 06.10.2005, 22:47
Оценка за ответ: 5
Комментарий оценки:
Разбивать строку по разделителю - это очень удобно и действительно просто.
Огромное спасибо за ответ.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Rambler's Top100 Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное