Записки программиста Программирование и не только

26Ноя/121

[Qt] UTF в 1251 и 1251 в UTF

На входе имеем строку в HEX виде, да еще и в кодировке CP-1251. Надо Переделать её в UTF-8
Я использовал для этого QTextCodec.

QByteArray msg = QByteArray::fromHex("cde5eff0e0e2e8ebfcedeee520f1eeeee1f9e5ede8e5204b4f4e5f544d5f484f53544b4e4620eef220d3cad2d121");
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
QString strf = codec->toUnicode(msg);
qDebug() << strf;

Переварили строчку и надо отправить её обратно, но на выходе нужен CP-1251
Процедура обратная.

QByteArray wtf_s(strf.toStdString().c_str()); //либо так
//wtf_s.append(strf); //либо так

QByteArray wtf = codec->fromUnicode(wtf_s);
qDebug() << wtf.toHex();

Ключевые слова: Qt, UTFtoCP1251, CP1251toUTF

20Ноя/120

[Android] Поворот экрана

Варианта управления экраном три:

1. Запретить поворот экрана
В раздел activity вписать

android:screenOrientation="portrait"

или

android:screenOrientation="landscape"

2. Обрабатываем поворот вручную
Т.к. метод onCreate() вызывается не только при создании Activity, но и при повороте экрана, можно отловить данные события.
Подробно можно почитать тут - http://developer.android.com/guide/topics/resources/runtime-changes.html (Кстати, там, возможно, опечатка)

Коротко:
Добавляем в класс Activity метод:

@Override
public Object onRetainNonConfigurationInstance() {
    final MyDataObject data = collectMyLoadedData();
    return data;
}

В котором производим сборку всех данных, которые нужно будет снова показать после поворота.

И в метод onCreate добавляем конструкцию:

final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data != null) {
    loadMyData();
}

В которой данные распаковываем обратно.

3. Запрет автоматического пересоздания Activity
В AndroidManifest.xml дописать в раздел activity

android:configChanges="orientation|keyboardHidden"

Метод не рекомендуемый, т.к. в сложных приложениях придется самостоятельно обновлять данные внутри программы.
Подробнее можно тут: http://stackoverflow.com/questions/7818717/why-not-use-always-androidconfigchanges-keyboardhiddenorientation
Ну или в официальной доке.

14Ноя/120

[Android] Первое приложение

Программа будет простенькой.
По нажатию кнопки будет выводится одна из 4 фраз, выбранная случайно, в случайную же область экрана.
ОС: 2.2.2
Сделаем также иконку приложения.

Разрабатывать будем в IntelliJ IDEA

Метки записи: , Читать полностью
6Ноя/122

Еще немного о классах

Класс - это упрощенное описание каких-нибудь реальных (чаще, правда, выдуманных) вещей.

Вот, например, точка. Единственное, что есть у точки - это её координаты в пространстве. Это её параметры.
Как задать точку на плоскости? Надо нарисовать точку и подписать её: M(1,2), т.е. точка с именем M и координатами х = 1, у = 2.
Это её "конструктор". Т.е. мы "сконструировали" конкретную точку М с конкретными координатами.

На языке Java это будет выглядеть так:

class Point {                       //общее описание точек
    private double x, y;            //параметры точки

    Point(double ax, double ay) {   //конструктор
        x = ax;
        y = ay;
    }
}

Сконструируем точку

Point M = new Point(1, 2);

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

Т.е. данная строчка работать не будет:

Point M = new Point(); //пустые параметры
//или
Point M = new Point(1); //неполные параметры

Дальше. Класс включает в себя не только параметры, но и методы.
Что такое метод класса? Это вопрос, который мы можем задать или указание, что-либо сделать. Причем и вопрос и указания нужно адресовать уже конкретной сконструированной точке.

Научим точку сообщать свои координаты и перемещаться по одной из координатных осей:

class Point {                       //общее описание точек
    private double x, y;            //параметры точки

    Point(double ax, double ay) {   //конструктор
        x = ax;
        y = ay;
    }

    //запрос координаты Х
    double getX() {
        return x;
    }

    //запрос координаты Y
    double getY() {
        return y;
    }

    //указание сдвинуться по оси X на расстояние dx
    void moveX(double dx) {
        x = x + dx;
    }

    //указание сдвинуться по оси Y на расстояние dy
    void moveY(double dy) {
        y = y + dy;
    }
}

//использование
public class Main {
    public static void main(String[] args) {
        //создаём точку
        Point M = new Point(1, 2);
        //спрашиваем у созданной точки - скажи нам, точка М свои координаты X и Y
        System.out.println("Текущие координаты точки М: x = " + M.getX() + ", у = " + M.getY());
        System.out.println("Сдвинем точку по оси Х на 5 и по оси У на -1");
        //просим точку М - точка М, сдвинься на 5 по оси X
        M.moveX(5);
        //просим точку М - точка М, сдвинься на -1 по оси Y
        M.moveY(-1);
        //спрашиваем у точки М - скажи нам, точка М свои координаты X и Y
        System.out.println("Новые координаты точки М: x = " + M.getX() + ", у = " + M.getY());
    }
}

Еще раз повторю - методы вызываются у конкретной точки - сконструированного объекта.
Класс - это просто заготовка, шаблон, описание.
Т.е. пока точка не создана - мы как бы задумываем её нарисовать.
А вот когда сказали new, это значит, что мы нарисовали конкретную точку в конкретном месте координатной плоскости.

Записи вида

Point.getX();
//или
Point.moveX(5);

Не имеют смысла, потому что описание ничего не знает.
Это как если спросить у человека - "скажи мне координаты точки?"
Логично будет подумать, что он ответит - "какой именно?"
Также делает и компилятор.

1Ноя/120

[Java] this, super

1. Как-то я писал, что не понимаю, зачем вызывать конструктор в конструкторе через this.
Разобрался.
Это для укорачивания кода.

Типа можно так:

class Point {
    int х, у; 
    Point(int х, int у) { 
        this.x = х; 
        this.у = у; 
    }
  
    Point() { 
        this.x = -1; 
        this.у = -1; 
    } 
}

А можно короче:

class Point {
    int х, у; 
    Point(int х, int у) { 
        this.x = х; 
        this.у = у; 
    }
  
    Point() { 
        this(-1, -1);   //конструктор вызывает другой конструктор
    } 
}

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

2. super
Данная функция служит для вызова конструктора базового класса. Используется, если базовый класс, например, не имеет конструктора по умолчанию

Пример

class X {
   X(int a) { ... }
   ...
}

class Y extends X {
    Y() {
        super(0);
        ...
    }
   ...
}

Также super может использоваться и для явного вызова методов базового класса. Это необходимо, если некоторый метод базового класса был переопределен в порожденном классе.

Пример

class Base {
    int x = 1;
    long y;
    Base(long y) {
        this.y = y;
    }
    Base() {
         this(0);   // вызов конструктора Base(long y)
    }
    public long f() {
        return x*y;
    }
}

class Derived extends Base {
    String name = "";
    Derived(String name, long par) {
          super(par);   // вызов конструктора Base(long y)
          this.name = name;
    }
    public long g(int r) {
         return r+super.f();   // вызов метода f() класса Base
    }
    public long f() {
          x++;
          return 2*y;
    }
}
Метки записи: Нет комментариев