[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    Использую Delphi 7 & Indy 10.5.7 (rev. 3880+)

    Письма в TIdMessage отдаются в unicode.

    Вопрос - как конвертировать в ansi формат тело письма?
     
  2. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Стандартная кодировка анси то же самое что первые 127 символов юникода.
     
  3. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    Проблема решена переходом на Delphi 2010.
     
  4. mobilka

    mobilka Member

    Joined:
    13 Oct 2009
    Messages:
    39
    Likes Received:
    5
    Reputations:
    0
    помогите вывести данные в memo
    как видно сейчас выводятся в caption формы а надо в memo1
     
  5. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    mobilka
    заменить весь текст в мемо Memo1.Text:=s;
    либо добавить строку Memo1.Lines.Add(s);
     
    1 person likes this.
  6. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    Использую 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.
     
  7. mobilka

    mobilka Member

    Joined:
    13 Oct 2009
    Messages:
    39
    Likes Received:
    5
    Reputations:
    0
    спасибо. а как в listbox вывести?
    разобрался- Listbox1.Items.Add(s);
     
  8. P.A.U.L

    P.A.U.L New Member

    Joined:
    12 Aug 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    [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.
     
  9. StealthMaster

    StealthMaster Member

    Joined:
    3 Dec 2008
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    В массиве 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.
    
    Писал без паскаля, возможно где-то ошибся.
     
    #4769 StealthMaster, 24 Nov 2009
    Last edited: 24 Nov 2009
    1 person likes this.
  10. mobilka

    mobilka Member

    Joined:
    13 Oct 2009
    Messages:
    39
    Likes Received:
    5
    Reputations:
    0
    помогите написать функцию. нажимаем button1, открывается опендиалог, выбираем файл .txt и выводим содержимое в listbox
     
  11. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    if opendialog.execute then listbox.items.loadfromfile(opendialog.filename);
     
  12. mobilka

    mobilka Member

    Joined:
    13 Oct 2009
    Messages:
    39
    Likes Received:
    5
    Reputations:
    0
    спасибо. теперь нужно следующее-
    имеем файл .txt
    в нем информация вида-
    [1]
    09843075432
    [2]
    7854325890863216809765434
    [3]
    65D432
    и т.д т.п
    нужно выдернуть определенный блок например [2] и его содержимое т.е 7854325890863216809765434 вывести в тот же листбокс
     
  13. P.A.U.L

    P.A.U.L New Member

    Joined:
    12 Aug 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    StealthMaster, спс за помощь, попробую разобраться:) Но тот метод который ты применил, т.е. использовал массив записей, я не знаю... Но попробую все таки разобраться:)
     
  14. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Тебе же написали, за загрузку из файла в листбок отвечает функция
    Можешь использовать скрытый лист-бокс как буфер, и если тебе нужно 2-ю строку, то бери оттуда вторую строку ListBox2.Items[2] и добавляй ее в свой видимый листбокс.
    Code:
    ListBox1.Items.Add(ListBox2.Items[2]);
    Лучше было бы конечно создавать стринг лист в памяти, но смотри сам.
     
    #4774 =Zeus=, 24 Nov 2009
    Last edited: 24 Nov 2009
  15. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    "Работа с ini файлами" в гугле
     
    #4775 wolmer, 24 Nov 2009
    Last edited: 24 Nov 2009
  16. mobilka

    mobilka Member

    Joined:
    13 Oct 2009
    Messages:
    39
    Likes Received:
    5
    Reputations:
    0
    блин выдирает не то что нужно. а именно-
    в листбокс 2 загружается-
    [1]
    09843075432
    [2]
    7854325890863216809765434
    [3]
    65D432
    в листбокс1 выводит вторую строчку-
    09843075432
    а нужно 7854325890863216809765434
    а если файл содержит всего одну строчку то программа вылетает с ошибкой.
    p.s заменить [2] на [4] я догадался но это не то что нужно.
     
    #4776 mobilka, 24 Nov 2009
    Last edited: 24 Nov 2009
  17. P.A.U.L

    P.A.U.L New Member

    Joined:
    12 Aug 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    [Pascal]И еще вот эту помогите доработать чутка...

    Вот так звучит задача: Дана строка символов, удалить из нее все строчные латинские символы)

    Баг программы заключается в том, что удаляет не каждый символ который должен быть удален, а через один...

    [i][i][i][i][i][i][i][i][/i][/i][/i][/i][/i][/i][/i][/i]
     
  18. speles

    speles Banned

    Joined:
    21 Aug 2009
    Messages:
    43
    Likes Received:
    3
    Reputations:
    0
    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.
     
  19. mobilka

    mobilka Member

    Joined:
    13 Oct 2009
    Messages:
    39
    Likes Received:
    5
    Reputations:
    0
    помогите пожалуйста
     
  20. P.A.U.L

    P.A.U.L New Member

    Joined:
    12 Aug 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    speles, спс огромное, работает:)
     
Thread Status:
Not open for further replies.