Политика, которую я имею с такими ситуациями, состоит в том, чтобы передать stringlist содержание через текстовое свойство и просто передать строку, возвращенную к функции. Таким образом, там не является никакая потребность обсудить, кто выпускает кто. Конечно, необходимо сделать немного больше кодирования, но это более безопасно. Примером является адаптация одной Ken White:
var
SL: TStringList;
Aux: String;
begin
SL := TStringList.Create;
try
SL.Text := ProcToFillStringList;
//Do something with populated list
finally
SL.Free;
end;
end;
// It receives a default param, in the case you have to deal with
// StringList with some previous content
function ProcToFillStringList(SListContent: String = ''):String;
// Do the stuff you need to do with the content
end;
исключение - когда все, что Вы имеете, является объектом и нет никакого способа получить содержание на нем через безопасный тип (в этом случае, строки); тогда я следую за идеей Ken White.
Идиоматический способ использования средств визуализации ячеек таблицы Scala - использовать Table.AbstractRenderer
( если вы реализуете свой собственный) или один из его подклассов:
val tcr = new Table.AbstractRenderer[MyObj, MyRenderer](new MyRenderer) {
def configure(t: Table, sel: Boolean, foc: Boolean, o: MyObj, row: Int, col: Int) = {
//component variable is bound to your renderer
component.prepare(o)
}
}
В этом случае prepare
- это метод, который вы должны определить в своем собственном классе средства визуализации:
class MyRenderer extends Label {
def prepare(o: MyObj) {
text = o.toString //or whatever
}
}
Затем он используется путем переопределения компонента визуализации
метод в таблице
:
val t = new Table {
override def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int) = {
//FIND VALUE
val v = model.getValueAt(
peer.convertRowIndexToModel(row),
peer.convertColumnIndexToModel(row))
col match {
case 0 => tcr.componentFor(this, sel, foc, v, row, col)
}
}
}
Scala поставляется со своими собственными реализациями AbstractRenderer
, а именно LabelRenderer
, который принимает функцию в качестве аргумента, преобразуя экземпляр MyObj в Tuple2
, состоящий из String
и ] Значок
, для отображения этой метки:
val ltcr = new LabelRenderer[MyObj] ( (o: MyObj) => (null, o.toString) )