Использую Delphi 7 & Indy 10.5.7 (rev. 3880+) Письма в TIdMessage отдаются в unicode. Вопрос - как конвертировать в ansi формат тело письма?
Использую Delphi 2010 & Indy 10.5.7 (rev. 3880+) При отправке POST запроса, он автоматически кодируется в unicode (TIdURI.ParamsEncode не предлагать). Соответственно, ansi - строки отправить не получается. Ищу универсальное решение, пока что сделал функцию: Code: function httppost (http : tidhttp; adr : string; post : tstringlist) : string; function urlencode (str : ansistring) : ansistring; function chartohex (ch : ansichar) : integer; asm and eax, 0FFh mov ah, al shr al, 4 and ah, 00fh cmp al, 00ah jl @@10 sub al, 00ah add al, 041h jmp @@20 @@10: add al, 030h @@20: cmp ah, 00ah jl @@30 sub ah, 00ah add ah, 041h jmp @@40 @@30: add ah, 030h @@40: shl eax, 8 mov al, '%' end; var i, len : integer; ch : ansichar; n : integer; p : pansichar; begin Result := ''; len := length (str); p := pansichar (@N); for i := 1 to len do begin Ch := Str[i]; if ch in ['0'..'9', 'A'..'Z', 'a'..'z', '_', '='] then Result := Result + ch else begin if ch = ' ' then Result := Result + '+' else begin n := chartohex (ch); Result := Result + p; end; end; end; end; var str : tstringstream; i : integer; m : ansistring; isansi : boolean; begin isansi := false; str := tstringstream.create(''); m := post.gettext; for i := 1 to length (m) do if m[i] in ['а'..'я', 'А'..'Я', 'ё', 'Ё'] then isansi := true; if isansi = true then begin http.httpoptions := []; for i := 0 to post.count - 1 do post.strings[i] := urlencode (post.strings[i]); try http.post (adr, post, str); except end; http.httpoptions := [hoforceencodeparams]; end else begin try http.post (adr, post, str); except end; end; Result := str.datastring; str.free; end; Но, как видите, громоздко и не эстетично. Напомню, речь о Delphi 2010, где string по-умолчанию - unicodestring.
[Pascal] Помогите доделать программу: Задание звучит так: Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов каждой строке. Препод сказал, что там надо вконце написать какое то условие и присовить и уже вывести отсортированную матрицу, а я хз как сделать Code: program matr1; uses crt; const n=5; const m=10; type s=array[1..n,1..m] of integer; const a:s=((1,1,1,1,1,6,7,8,9,10), (1,2,2,2,5,6,7,8,9,10), (1,2,3,3,5,6,7,8,9,10), (1,7,7,7,7,7,7,7,7,10), (1,2,3,7,7,7,7,7,7,10)); var i,j,gl,loc,r,x,k:integer; b: array[1..n] of integer; begin clrscr; writeln('Исходная матрица:'); for i:=1 to n do begin for j:=1 to m do begin write(a[i,j]:3); end; writeln; end; {Подсчет количества одинаковых элементов} for i:=1 to n do begin gl:=0; for j:=1 to m-1 do begin loc:=1; for r:=j+1 to m do if a[i,j]=a[i,r] then loc:=loc+1; if loc>gl then begin gl:=loc; loc:=0 end; end; b[i]:=gl; end; for i:=1 to n do write(b[i],' '); writeln; for i:=1 to n-1 do begin x:=b[i]; k:=i; for j:=i+1 to n do if b[j]<x then begin x:=b[j]; k:=j end; b[k]:=b[i]; b[i]:=x; (Вот здесь чего то нехватает) end; for i:=1 to n do write(b[i],' '); writeln; readkey; end.
В массиве b хранится количество самых часто встречающихся одинаковых элементов в строках матрицы. Найди минимальный из элементов этого массива, выведи строку, соответствующую ему. Потом берешь второй по величине элемент и выводишь строку, соответствующую ему. И т.д. до N. На мой взгляд, было бы удобнее использовать массив записей Code: type TMatrixStrings = record StringNumber: integer; Count: integer; end; Где count - количество элементов, которые чаще всего повторялись в строке матрицы. Упорядочить этот массив по полю count, а затем вывести матрицу. Code: program matr1; uses crt; const n=5; const m=10; type s=array[1..n,1..m] of integer; const a:s=((1,1,1,1,1,6,7,8,9,10), (1,2,2,2,5,6,7,8,9,10), (1,2,3,3,5,6,7,8,9,10), (1,7,7,7,7,7,7,7,7,10), (1,2,3,7,7,7,7,7,7,10)); type TMatrixStrings = record StringNumber: integer; Count: integer; end; var i, j, gl, loc, r, x, k: integer; b: array[1..n] of TMatrixStrings; begin clrscr; writeln('Исходная матрица:'); for i:=1 to n do begin for j:=1 to m do begin write(a[i,j]:3); end; writeln; end; {Подсчет количества одинаковых элементов} for i:=1 to n do begin gl:=0; for j:=1 to m-1 do begin loc:=1; for r:=j+1 to m do if a[i,j]=a[i,r] then loc:=loc+1; if loc>gl then begin gl:=loc; loc:=0 end; end; b[i].count:=gl; b[i].StringNumber := i; end; for i:=1 to n do write(b[i].count,' '); writeln; // сортировка for i:=1 to n-1 do begin x:=b[i].count; k:=i; for j:=i+1 to n do if b[j].count<x then begin x:=b[j].count; k:=j; end; b[k].count:=b[i].count; b[i].count:=x; x := b[i].StringNumber; b[i].StringNumber := b[k].StringNumber b[k].StringNumber := x; end; // вывод упорядоченной матрицы for i:=1 to n do writeln(a[b[i].StringNumber]); writeln; readkey; end. Писал без паскаля, возможно где-то ошибся.
помогите написать функцию. нажимаем button1, открывается опендиалог, выбираем файл .txt и выводим содержимое в listbox
спасибо. теперь нужно следующее- имеем файл .txt в нем информация вида- [1] 09843075432 [2] 7854325890863216809765434 [3] 65D432 и т.д т.п нужно выдернуть определенный блок например [2] и его содержимое т.е 7854325890863216809765434 вывести в тот же листбокс
StealthMaster, спс за помощь, попробую разобраться Но тот метод который ты применил, т.е. использовал массив записей, я не знаю... Но попробую все таки разобраться
Тебе же написали, за загрузку из файла в листбок отвечает функция Можешь использовать скрытый лист-бокс как буфер, и если тебе нужно 2-ю строку, то бери оттуда вторую строку ListBox2.Items[2] и добавляй ее в свой видимый листбокс. Code: ListBox1.Items.Add(ListBox2.Items[2]); Лучше было бы конечно создавать стринг лист в памяти, но смотри сам.
блин выдирает не то что нужно. а именно- в листбокс 2 загружается- [1] 09843075432 [2] 7854325890863216809765434 [3] 65D432 в листбокс1 выводит вторую строчку- 09843075432 а нужно 7854325890863216809765434 а если файл содержит всего одну строчку то программа вылетает с ошибкой. p.s заменить [2] на [4] я догадался но это не то что нужно.
[Pascal]И еще вот эту помогите доработать чутка... Вот так звучит задача: Дана строка символов, удалить из нее все строчные латинские символы) Баг программы заключается в том, что удаляет не каждый символ который должен быть удален, а через один... [i][i][i][i][i][i][i][i][/i][/i][/i][/i][/i][/i][/i][/i]
to P.A.U.L. коряво но всеже Code: uses crt; var s,ss:string; i,l:integer; begin clrscr; write('stroka: '); readln(s); l:=length(s); for i:=1 to l do begin if not ((s[i]=(chr(97))) or (s[i]=(chr(98))) or (s[i]=(chr(99))) or (s[i]=(chr(100)))or (s[i]=(chr(101)))or(s[i]=(chr(102)))or(s[i]=(chr(103)))or(s[i]=(chr(104)))or (s[i]=(chr(105)))or(s[i]=(chr(106)))or(s[i]=(chr(107)))or(s[i]=(chr(108)))or (s[i]=(chr(109)))or(s[i]=(chr(110)))or(s[i]=(chr(111)))or (s[i]=(chr(112)))or(s[i]=(chr(113)))or(s[i]=(chr(114)))or(s[i]=(chr(115)))or (s[i]=(chr(116)))or(s[i]=(chr(117)))or(s[i]=(chr(118)))or (s[i]=(chr(119)))or(s[i]=(chr(120)))or(s[i]=(chr(121))) or (s[i]=(chr(122)))or(s[i]=(chr(123)))or(s[i]=(chr(124)))) then ss := ss + s[i] end; writeln(ss); readln; end.